我正在尝试使用包含可绘制对象的 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 上看到的一些示例以不同的方式实现它,而其他一些示例则按照我的方式实现它。
我现在得到的是一个只有一个面板的框架(我相信,因为我的任何尝试都没有显示 Canvas/drawable JPanel)和它的按钮。不完全是我想要的。
我知道我可能会打开一个辅助框架来显示画布/可绘制面板,但我宁愿将其全部放在一个地方,这就是我在这里的原因。
请参阅 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);
}