Java Swing仅在调整大小后绘制
程序应该在点击按钮后再画两次线,但它只在点击并调整窗口大小后才这样做。我不知道发生了什么,我以为这很容易 你能告诉我怎么修吗Java Swing仅在调整大小后绘制,java,swing,Java,Swing,程序应该在点击按钮后再画两次线,但它只在点击并调整窗口大小后才这样做。我不知道发生了什么,我以为这很容易 你能告诉我怎么修吗 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Line2D; import java.awt.geom.Point2D; import java.u
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.Random;
import java.util.Stack;
class MyButtonPanel extends JPanel {
public static final int HEIGHT = 800;
public static final int WIDTH = 800;
private JButton greenButton;
private JPanel buttonPanel;
Stack<Point> points;
int X = 25;
int Y = 25;
public MyButtonPanel() {
greenButton = new GreenButton();
points = new Stack<Point>();
buttonPanel = this;
setLayout(new FlowLayout());
setPreferredSize(new Dimension(WIDTH, HEIGHT));
add(greenButton);
}
class GreenButton extends JButton implements ActionListener
{
GreenButton() {
super("LongerLine");
addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
//points.push(new Point(0,0));
X = 2 * X;
Y = 2 * Y;
validate();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
//g2d.setColor(Color.WHITE);
//g2d.fillRect(0, 0, WIDTH, HEIGHT);
g2d.setColor(Color.BLACK);
//drawLines(g2d);
Line2D lin = new Line2D.Double(0,0, X, Y);
g2d.draw(lin);
}
private void drawLines(Graphics2D g2d) {
//Line2D lin = new Line2D.Float(100, 100, 250, 260);
//g2d.draw(lin);
double x1, y1, x2, y2;
/*
for(Point point: points) {
x1 = (double) point.getX();
y1 = (double) point.getY();
Line2D line = new Line2D.Double(x1,y1,200,200);
g2d.draw(line);
}
*/
}
}
public class MyActionFrame extends JFrame {
public MyActionFrame() {
super("Test akcji");
JPanel buttonPanel = new MyButtonPanel();
add(buttonPanel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
//setResizable(false);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new MyActionFrame();
}
});
}
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.Line2D;
导入java.awt.geom.Point2D;
导入java.util.Random;
导入java.util.Stack;
类MyButtonPanel扩展了JPanel{
公共静态最终内部高度=800;
公共静态最终整数宽度=800;
私人JButton绿色按钮;
私人JPanel按钮面板;
叠加点;
int X=25;
int Y=25;
公共MyButtonPanel(){
绿色按钮=新的绿色按钮();
点=新堆栈();
buttonPanel=这个;
setLayout(新的FlowLayout());
setPreferredSize(新尺寸(宽度、高度));
添加(绿色按钮);
}
类GreenButton扩展JButton实现ActionListener
{
绿色按钮(){
超级(“长线”);
addActionListener(此);
}
@凌驾
已执行的公共无效操作(操作事件e){
//点。推(新点(0,0));
X=2*X;
Y=2*Y;
验证();
}
}
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
//g2d.setColor(Color.WHITE);
//g2d.fillRect(0,0,宽度,高度);
g2d.setColor(Color.BLACK);
//抽绳(g2d);
Line2D lin=新的Line2D.Double(0,0,X,Y);
g2d.绘图(林);
}
专用空心绘制线(Graphics2D g2d){
//Line2D lin=新的Line2D.Float(100100250260);
//g2d.绘图(林);
双x1,y1,x2,y2;
/*
用于(点:点){
x1=(双)点.getX();
y1=(双)点.getY();
Line2D line=新的Line2D.Double(x1,Y1200200);
g2d.绘制(直线);
}
*/
}
}
公共类MyActionFrame扩展了JFrame{
公共MyActionFrame(){
超级(“测试akcji”);
JPanel buttonPanel=新的MyButtonPanel();
添加(按钮面板);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
包装();
setVisible(真);
//可设置大小(假);
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
新的MyActionFrame();
}
});
}
}
此验证()代码>,或更好的重新验证()当需要重新完成容器的布局时,通常在添加或删除组件时调用code>,这不是您正在做或希望做的事情。相反,您希望调用repaint()
,这建议对组件进行绘制。此validate()代码>,或更好的重新验证()当需要重新完成容器的布局时,通常在添加或删除组件时调用code>,这不是您正在做或希望做的事情。相反,您希望调用repaint()
,这建议对组件进行绘制。我已将validate()更改为repaint(),其行为仍然相同。@TomaszŻuchowski,您需要重新绘制面板,而不是按钮。您的代码结构不正确。没有必要扩展JButton。X/Y变量是面板的一部分,ActionListener也应该在面板中定义。然后,当调用侦听器时调用repaint()时,repaint()将用于面板,而不是button@camickr:请回答这个问题,因为我没听清楚。我已将validate()更改为repaint(),但其行为仍然相同。@TomaszŻuchowski,您需要重新绘制面板,而不是按钮。您的代码结构不正确。没有必要扩展JButton。X/Y变量是面板的一部分,ActionListener也应该在面板中定义。然后,当调用侦听器时调用repaint()时,repaint()将用于面板,而不是button@camickr当前位置请回答这个问题,因为我没听清楚。