Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用2个JPanel时Swing Java重新绘制不起作用_Java_Swing_3d_Awt_Graphics2d - Fatal编程技术网

使用2个JPanel时Swing Java重新绘制不起作用

使用2个JPanel时Swing Java重新绘制不起作用,java,swing,3d,awt,graphics2d,Java,Swing,3d,Awt,Graphics2d,正如您从代码中看到的,我希望在DrawingPanel上看到一个矩形,但我不确定为什么repaint()方法不起作用。任何帮助都将不胜感激。我还尝试了重新验证方法,但也不起作用 以下是我的课程: import javax.swing.*; import java.awt.*; public class Designer extends JFrame { static JFrame f = new Designer(); JSplitPane splitPane = new JSplitPa

正如您从代码中看到的,我希望在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);
  }

}
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
  }
}
第二个Jpanel的类:DrawingPanel.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);
  }

}
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
  }
}
import javax.swing.*;
导入java.awt.*;
导入java.util.ArrayList;
导入java.util.List;
公共类DrawingPanel扩展了JPanel{
私有列表方块=新的ArrayList();
@凌驾
受保护组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
系统输出打印(“绘制”);
用于(矩形矩形:正方形){
g2.绘制(rect);
}
}
公共void addRectangle(){
矩形rectx=新矩形(10,10,100,100);
正方形。添加(rectx);

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

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

e、 例如,改变这一点:

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;
然后在创建时将true DrawingPanel传入此对象:

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


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

非常感谢。这确实很有帮助。@VK321:不客气,但它有意义吗?另外,请参阅编辑以回答问题。