【问题标题】:Swing draws only after resizingSwing 仅在调整大小后绘制
【发布时间】:2017-06-08 00:59:04
【问题描述】:

单击按钮后,程序应该再画两次线,但只有在单击并调整窗口大小后才会这样做。我不知道发生了什么,我以为这很容易。

您能告诉我如何解决吗?

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

【问题讨论】:

    标签: java swing


    【解决方案1】:

    这个validate();,或者更好的revalidate(); 在需要重新完成容器的布局时调用,通常是在添加或删除组件时,而不是你正在做或不想要的。相反,您想调用 repaint(),这表明该组件被绘制。

    【讨论】:

    • 我已将 validate() 更改为 repaint() 并且它的行为仍然相同。
    • @TomaszŻuchowski,您需要重新绘制面板,而不是按钮。您的代码结构不正确。无需扩展 JButton。 X/Y 变量是面板的一部分,ActionListener 也应该在面板中定义。然后,当您在调用侦听器时调用 repaint() 时,repaint() 将用于面板,而不是按钮
    • @camickr:请回答,因为我没听懂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多