【问题标题】:Swing Java repaint not working using 2 jpanelsSwing Java重绘无法使用2个jpanels
【发布时间】:2018-06-16 05:14:16
【问题描述】:

从代码中可以看出,我希望在 DrawingPanel 上看到一个矩形,但我不确定为什么 repaint() 方法不起作用。任何帮助都感激不尽。我也尝试了重新验证方法,但这也不起作用。

这是我的课程:

import javax.swing.*;
import java.awt.*;

public class Designer extends JFrame {

static JFrame f = new Designer();

JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
DrawingPanel drawingPanel = new DrawingPanel();
PropertyPanel propertyPanel = new PropertyPanel();

 public Designer(){

    Rectangle bounds = GraphicsEnvironment
            .getLocalGraphicsEnvironment()
            .getMaximumWindowBounds();

    splitPane.setTopComponent(propertyPanel);
    splitPane.setBottomComponent(drawingPanel);

    add(splitPane, BorderLayout.CENTER);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(bounds);
    setVisible(true);

 }

 public static void main(String[] args) {
    System.out.println("App started...");
 }
}

第一个 Jpanel 的类:PropertyPanel.Java

import javax.swing.*;
import java.awt.event.*;

public class PropertyPanel extends JPanel {

  private DrawingPanel drawingPanel = new DrawingPanel();

  public PropertyPanel(){

    JButton addShapesBtn = new JButton("Add");

    addShapesBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            drawingPanel.addRectangle();
        }
    });
    add(addShapesBtn);
  }

}

第二个 Jpanel 的类:DrawingPanel.Java

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class DrawingPanel extends JPanel{

  private List<Rectangle> squares = new ArrayList<Rectangle>();


 @Override
 protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D) g;

    System.out.println("painting");

    for (Rectangle rect : squares) {
        g2.draw(rect);
    }

}


  public void addRectangle() {

    Rectangle rectx = new Rectangle(10, 10, 100, 100);
    squares.add(rectx);
    repaint(); <-- this is not working
  }
}

【问题讨论】:

    标签: java swing 3d awt graphics2d


    【解决方案1】:

    您的重绘工作正常。您的问题是您将 addRectangle() 调用到 wrong DrawingPanel 实例,而不是当前显示在 GUI 中的实例。要解决此问题,请将显示的引用传递给需要调用该方法的代码。

    要查看这是否正确,只需在此页面上搜索 new DrawingPanel()。您应该在您自己的代码(以及您发布的代码)中只看到 一次。你看到它两次意味着你已经创建了这个的两个实例。

    例如,改变这个:

    public class PropertyPanel extends JPanel {   
        private DrawingPanel drawingPanel = new DrawingPanel();
    
        public PropertyPanel(){
    

    到这里:

    public class PropertyPanel extends JPanel {    
        private DrawingPanel drawingPanel;  // don't create new
    
        public PropertyPanel(DrawingPanel drawingPanel){
            this.drawingPanel = drawingPanel;
    

    然后在创建时将真正的 DrawingPanel 传入此对象:

    DrawingPanel drawingPanel = new DrawingPanel();
    PropertyPanel propertyPanel = new PropertyPanel(drawingPanel);
    

    更好的是:以 M-V-C 方式构建您的代码,并使用依赖注入来建立连接——但这对于您的简单 GUI 来说可能是多余的。

    【讨论】:

    • 非常感谢。这真的很有帮助。
    • @VK321:不客气,但这有意义吗?另请参阅编辑以回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多