Install
apache-groovy-binary-3.0.22.zip
GROOVY_HOME, PATH
$> bin/groovy -version
Groovy Version: 3.0.22 JVM: 17.0.12 Vendor: Amazon.com Inc. OS: Linux
创建一个交互式 Groovy shell,您可以在其中键入 Groovy 语句
groovysh
运行 Swing 交互式控制台 (groovy-console-4.0.27.jar)
groovyConsole
. "$DIRNAME/startGroovy"
export JAVA_OPTS="-Dsun.awt.keepWorkingSetOnMinimize=true $JAVA_OPTS"
startGroovy groovy.console.ui.Console "$@"
运行特定的 Groovy 脚本
groovy SomeScript
groovyc MyClass.groovy // MyClass.class
apache-groovy-src-4.0.27.zip (Gradle 8.12)
https://github.com/apache/groovy
https://services.gradle.org/distributions/
JDK 16+
不是必要
gradle -p bootstrap
gradlew clean dist
gradle tasks
gradle build -x test 报错
gradle dist -x test 成功
新建 project (Gradle 8.12)
https://docs.gradle.org/current/samples/sample_building_groovy_applications.html
gradle tasks
$> gradle init
Select type of build to generate:
1: Application
2: Library
3: Gradle plugin
4: Basic (build structure only)
Enter selection (default: Application) [1..4] 1
Select implementation language:
1: Java
2: Kotlin
3: Groovy
4: Scala
5: C++
6: Swift
Enter selection (default: Java) [1..6] 3
Enter target Java version (min: 7, default: 21):
Project name (default: demo):
Select application structure:
1: Single application project
2: Application and library project
Enter selection (default: Single application project) [1..2] 1
Select build script DSL:
1: Kotlin
2: Groovy
Enter selection (default: Kotlin) [1..2]
build.gradle
plugins {
id 'groovy'
id 'application'
}
repositories {
mavenCentral()
}
dependencies {
implementation libs.groovy.all
implementation libs.guava
testImplementation libs.spock.core
testImplementation libs.junit
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
application {
mainClass = 'demo.App'
}
tasks.named('test') {
useJUnitPlatform()
}
SwingBuilder
example1
import groovy.swing.SwingBuilder
import javax.swing.*
import javax.swing.JFrame
import javax.swing.WindowConstants
import java.awt.BorderLayout
static void main(String[] args) {
def swing = new SwingBuilder()
def buttonPanel = {
swing.panel(constraints : BorderLayout.SOUTH) {
button(text : 'Option A', actionPerformed : {
println 'Option A chosen'
})
button(text : 'Option B', actionPerformed : {
println 'Option B chosen'
})
}
}
def mainPanel = {
swing.panel(layout : new BorderLayout()) {
label(text : 'Which Option do you want',
horizontalAlignment : JLabel.CENTER,
constraints : BorderLayout.CENTER)
buttonPanel()
}
}
def myframe = swing.frame(
title : 'Tutorials Point',
location : [100, 100],
size : [400, 300],
defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE){
mainPanel()
}
myframe.setVisible(true)
}
example2
import groovy.swing.SwingBuilder
import javax.swing.WindowConstants
import java.awt.BorderLayout;
static void main(String[] args) {
def swing = new SwingBuilder()
swing.frame(title : 'Tutorials Point',
location : [100, 100],
size : [400, 300],
layout: new BorderLayout(),
show:true,
defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE,
){
scrollPane(constraints: BorderLayout.CENTER) {
textArea()
}
panel(constraints: BorderLayout.SOUTH) {
button(text: 'Click', actionPerformed: {
println 'hhhh'
})
}
}
}
SwingBuilder 链接
https://www.tutorialspoint.com/groovy/groovy_builders.htm
https://wizardforcel.gitbooks.io/ibm-j-pg/content/1.html
http://de.uwenku.com/question/p-yoayckhz-db.html
https://code.fandom.com/wiki/Groovy.swing.SwingBuilder
https://uberconf.com/blog/andres_almiray/2009/11/building_rich_swing_applications_with_groovy__part_i
https://freecontent.manning.com/wp-content/uploads/groovy-swingbuilder-and-threading.pdf
def customMenuBar = {
swing.menuBar{
menu(text: "File", mnemonic: 'F') {
menuItem(text: "Exit", mnemonic: 'X', actionPerformed: { dispose() })
}
}
}
def searchPanel = {
swing.panel(constraints: BorderLayout.NORTH){
searchField = textField(columns:15)
button(text:"Search", actionPerformed:{ /* TODO */ } )
}
}
panel(id:'main') {
panel {
button(name:'x', action: action(name:'add', closure:{p.add(label('new')); p.revalidate()}))
button(action: action(name:'remove', closure:{p.removeAll();p.revalidate();scroll.repaint()}))
}
panel() {
scrollPane(id:'scroll',preferredSize: [200,200], constraints: context.CENTER) {
panel(id:'p') {
checkBoxList(listData: (1..20).collect([]){"Option $it"} as Object[])
}
}
}
}
Java Swing 绘制组件
https://zetcode.com/javaswing/painting/
import javax.swing.*;
import java.awt.*;
public class CustomPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); // Ensures the panel is rendered correctly
g.setColor(Color.BLUE);
g.fillRect(20, 20, 100, 100); // Custom drawing code
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.add(new CustomPanel());
frame.setVisible(true);
}
}
算法4 Library
https://gitee.com/ZC_86/algorithms---4th-edition.git
直接复制 StdDraw.java
int N = 100;
StdDraw.setXscale(0, N);
StdDraw.setYscale(0, N * N);
StdDraw.setPenRadius(.01);
for (int i=1; i<=N; i++) {
StdDraw.point(i, i);
StdDraw.point(i, i*i);
StdDraw.point(i, i*Math.log(i));
}