如何向 Swing GUI 添加 Canvas 和其他组件

问题描述 投票:0回答:1

我正在尝试使用包含可绘制对象的 Swing 创建和应用程序,可以通过使用动作侦听器调用命令在运行时绘制该对象。

问题是,每次我添加 Canvas 或 JPanel 时,它都不会显示,除非我让它占据整个框架,这不是我的目标。

当前代码如下所示:

public class LRGS {

    public static void GUI() {
        Graph mainGraph = new Graph();
        JFrame frame = new JFrame("LRG – Type S");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        JPanel mainPanel = new JPanel();
        JPanel nPanel = new JPanel();
        JButton j = new JButton("fesdf");
        nPanel.add(j);
        mainPanel.add(nPanel);
        mainPanel.add(mainGraph);
        frame.add(mainPanel);

        // Display the window.
        frame.setVisible(true);

        mainGraph.l();

    }

    public static void main(String[] args) {
        // Schedule a job for the event-dispatching thread:
        // creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                GUI();
            }
        });
    }
}

class Graph extends JPanel {
    JPanel graphPanel;
    Canvas graph;
    Graphics g;

    public Graph() {
        // Create Panel for Components
        graphPanel = new JPanel();
        graph = new Canvas();
        graph.setSize(122, 122);
        graphPanel.add(graph);
        g.drawString("H", 100, 100);
    }

    public void l() {
        repaint();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString("Hello World!", 100, 100);
    }

}

对于造成的混乱,我深表歉意,但我现在已经在这个问题上徘徊了几个小时,并且真的不知道自己站在哪里。

我尝试过的: 1. 我尝试添加一个 JPanel 作为可绘制对象到主面板中,但没有成功。

2. 我尝试使用 GridBagLayout 告诉 Java 我希望类的 Canvas/drawable 面板位于组件/其他面板旁边。

3. 我尝试在没有额外课程的情况下添加它(尽管我更喜欢将它放在单独的课程中)。

我的期望: 我认为可以使用一些面板简单地将 Canvas 添加到 Swing GUI 中。如前所述,我的目标是其中也包含其他组件,因此我可以通过它们传递输入,以便在 Canvas/drawable 面板上显示一些输出。

我对如何使用 Graphics 也有点困惑,因为我在教程和 StackOverflow 上看到的一些示例以不同的方式实现它,而其他一些示例则按照我的方式实现它。

实际结果: Result

我现在得到的是一个只有一个面板的框架(我相信,因为我的任何尝试都没有显示 Canvas/drawable JPanel)和它的按钮。不完全是我想要的。

我知道我可能会打开一个辅助框架来显示画布/可绘制面板,但我宁愿将其全部放在一个地方,这就是我在这里的原因。

java swing canvas
1个回答
0
投票

请参阅 PaintArea 和 PaintArea2 以获取像您这样的想法:https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/ex/

您的问题似乎是您没有设置首选大小(当有布局管理器时,setSize通常是错误的,而设置preferredSize通常是正确的)。在你的例子中,因为 Canvas 是一个 AWT 组件,所以答案是重写 getPreferredSize

public Graph() {
    // Create Panel for Components
    graphPanel = new JPanel();
    graph = new Canvas() {
      public Dimension getPreferredSize() {
        return new Dimension(122,122);
      }
    };
    graphPanel.add(graph);
    g.drawString("H", 100, 100);
}
© www.soinside.com 2019 - 2024. All rights reserved.