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();
}
});
}
}

验证(),或更好的
重新验证(),这不是您正在做或希望做的事情。相反,您希望调用
repaint()
,这建议对组件进行绘制。

validate(),或更好的
重新验证(),这不是您正在做或希望做的事情。相反,您希望调用
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当前位置请回答这个问题,因为我没听清楚。