Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Java 从另一个类更改JFrame中可见的JPanel_Java_Multithreading_Swing_Jframe_Jpanel - Fatal编程技术网

Java 从另一个类更改JFrame中可见的JPanel

Java 从另一个类更改JFrame中可见的JPanel,java,multithreading,swing,jframe,jpanel,Java,Multithreading,Swing,Jframe,Jpanel,我有一个名为Window的类,它扩展了JFrame并设置了基本布局。在这个JFrame中,我想添加不同的JPanel,一个名为Tracking的单独类决定在JFrame中显示哪个JPanel。我希望跟踪类能够更改JFrame中显示的JPanel 每个JPanel都是一个独立的类,JFrame和Tracking类也是独立的类 Window.java package Setup; import javax.swing.JFrame; public class Window extends JFr

我有一个名为Window的类,它扩展了JFrame并设置了基本布局。在这个JFrame中,我想添加不同的JPanel,一个名为Tracking的单独类决定在JFrame中显示哪个JPanel。我希望跟踪类能够更改JFrame中显示的JPanel

每个JPanel都是一个独立的类,JFrame和Tracking类也是独立的类

Window.java

package Setup;

import javax.swing.JFrame;

public class Window extends JFrame
{

    private static final int width = 1280;
    private static final int height = 720;

    public Window()
    {
        setResizable(false);
        setSize(width, height);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        frame.setUndecorated(true);
//        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        new Window();
    }
}
package Setup;

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;

public class Animation extends JPanel
{

    private final int width = super.getWidth();
    private final int height = super.getHeight();
    private Image dbImage;
    private Graphics dbGraphics;

    public Animation()
    {
        setSize(width, height);
        setVisible(true);
    }

    @Override
    public void paint(Graphics g)
    {
        dbImage = createImage(getWidth(), getHeight());
        dbGraphics = dbImage.getGraphics();
        paintComponent(dbGraphics);
        g.drawImage(dbImage, 0, 0, this);
    }

    @Override
    public void paintComponent(Graphics g)
    {
        //ADD Animation to get attention from users
        g.drawString("TEST TEST TEST", 50, 50);
        repaint();
    }
}
Animation.java

package Setup;

import javax.swing.JFrame;

public class Window extends JFrame
{

    private static final int width = 1280;
    private static final int height = 720;

    public Window()
    {
        setResizable(false);
        setSize(width, height);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        frame.setUndecorated(true);
//        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        new Window();
    }
}
package Setup;

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;

public class Animation extends JPanel
{

    private final int width = super.getWidth();
    private final int height = super.getHeight();
    private Image dbImage;
    private Graphics dbGraphics;

    public Animation()
    {
        setSize(width, height);
        setVisible(true);
    }

    @Override
    public void paint(Graphics g)
    {
        dbImage = createImage(getWidth(), getHeight());
        dbGraphics = dbImage.getGraphics();
        paintComponent(dbGraphics);
        g.drawImage(dbImage, 0, 0, this);
    }

    @Override
    public void paintComponent(Graphics g)
    {
        //ADD Animation to get attention from users
        g.drawString("TEST TEST TEST", 50, 50);
        repaint();
    }
}

你有多少同居者

你可以。。。 传递帧或控制器的引用。这将允许您访问框架上的所有组件

这是一个坏主意,因为它会不必要地将框架暴露给控制器,给控制器比实际需要更多的权力

你可以。。。 将面板列表传递给控制器。这将允许控制器根据需要更换面板

这是一个不错的主意,但是一个聪明的控制器将能够使用getParent方法来推断顶级容器,再次不必要地公开应用程序的部分内容

你可以。。。 创建一个简单的模型,该模型具有简单的访问器,使控制器能够向UI建议哪些视图应处于活动状态。例如,这些可以命名为实例,或者您可以简单地提供
next
/
previous
/
first
/
last
方法,以允许控制器更改视图


这允许您以可插拔的方式更改视图顺序,只需提供一个新的模型,这不会影响应用程序的任何其他部分

不要从Winn调用任何绘制方法重新绘制。您必须调用super.paintXxx,因为这些方法需要进行大量额外的工作和设置,以适当地准备图形上下文。建议您使用paintComponent来执行所有的绘制我是GUI和绘制新手,实际上我是从教程中获得的。我应该替换replant()吗;用超级油漆(g)?您应该删除一起重新绘制的调用。将paint中的所有代码移动到paintComponent(删除对paintComponent的调用),并确保调用super.paintComponent作为方法的第一条语句查看更多详细信息感谢程序员!我的问题在老师的帮助下解决了