如何在不覆盖 JFrame 的情况下将 JPanel 图形添加到 JFrame
How to add a JPanel graphic to a JFrame without covering the JFrame
我正在尝试向我的相框添加一个小的龙卷风图形(倒金字塔)。我可以通过在 main 方法中将它添加到框架来获得龙卷风,但是当我这样做时,我看到的只是龙卷风图形,而不是它下面的 GUI。
所以,我现在尝试将 Tornado 图形添加到在 createComponents 方法中创建的框架中,但它现在根本没有出现。相反,我只能在框架中看到它的 GUI。
我可能遗漏了一些简单的东西,但我似乎无法弄明白。我不确定我需要做什么才能同时显示 GUI 和龙卷风图形。
public class EFScaleViewer {
public static void main(String[] args) {
// TODO Auto-generated method stub
TornadoFrame frame = new TornadoFrame();
frame.setTitle("EF Scale");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
这是我创建框架并尝试添加龙卷风的地方:
public class TornadoFrame extends JFrame{
private JButton submit;
private JLabel label;
static JLabel errorLabel;
static JTextField textBox;
JPanel tornado = new TornadoComponent();
private static final int FRAME_WIDTH = 400;
private static final int FRAME_HEIGHT = 300;
//Constructor for the frame
public TornadoFrame() {
super();
setSize(FRAME_WIDTH, FRAME_HEIGHT);
createComponents();
}
private void createComponents()
{
textBox = new JTextField(" ");
submit = new JButton("Submit");
label = new JLabel("Please enter a windspeed:");
errorLabel = new JLabel("Error Message " );
JPanel panel = new JPanel();
panel.add(label);
panel.add(textBox);
panel.add(submit);
panel.add(errorLabel);
panel.add(tornado);
add(panel);
}
}
我知道这是可行的,但我可能遗漏了一些东西,所以这里是我创建龙卷风的地方:
public class TornadoComponent extends JPanel {
public void paintComponent(Graphics g) {
int[] xPoints = {100,200,0};
int[] yPoints = {0,200,200};
int nPoints = 3;
g.drawPolygon(xPoints, yPoints, nPoints);
}
}
您必须设置 JPanels 大小才能显示图形。
static class TornadoComponent extends JPanel {
public TornadoComponent() {
setPreferredSize(new Dimension(500, 500));
}
@Override
public void paintComponent(Graphics g) {
//Whatever
}
}
并且为了触发 paintComponent(Graphics g)
,您必须在 createComponents()
函数的末尾添加 tornado.repaint();
。
private void createComponents() {
//All your components
panel.add(tornado);
add(panel);
tornado.repaint();
}
现在显示了多边形,但不在正确的位置(稍微偏离图像)
因此我们必须稍微安排一下您的 JPanel:
private void createComponents() {
textBox = new JTextField(" ");
submit = new JButton("Submit");
label = new JLabel("Please enter a windspeed:");
errorLabel = new JLabel("Error Message " );
JPanel upper = new JPanel();
upper.setLayout(new BoxLayout(upper,BoxLayout.X_AXIS));
upper.add(label);
upper.add(textBox);
upper.add(submit);
upper.add(errorLabel);
JPanel lower = new JPanel();
lower.setLayout(new BoxLayout(lower,BoxLayout.X_AXIS));
lower.add(tornado);
JPanel over = new JPanel();
over.setLayout(new BoxLayout(over,BoxLayout.Y_AXIS));
over.add(upper);
over.add(lower);
add(over);
tornado.repaint();
}
基本上我做一些盒子...
Over
Upper
... your stuff with text
Lower
Our tornado
现在我们的龙卷风方向错了...
int[] xPoints = {100,200,150};
int[] yPoints = {0,0,150};
瞧瞧:
我们刚刚创建了一个非常基本的龙卷风,它没有瞄准任何东西:)
如果你以后想改变龙卷风的位置,你只需要调用 tornado.repaint();
就可以了。
我正在尝试向我的相框添加一个小的龙卷风图形(倒金字塔)。我可以通过在 main 方法中将它添加到框架来获得龙卷风,但是当我这样做时,我看到的只是龙卷风图形,而不是它下面的 GUI。
所以,我现在尝试将 Tornado 图形添加到在 createComponents 方法中创建的框架中,但它现在根本没有出现。相反,我只能在框架中看到它的 GUI。
我可能遗漏了一些简单的东西,但我似乎无法弄明白。我不确定我需要做什么才能同时显示 GUI 和龙卷风图形。
public class EFScaleViewer {
public static void main(String[] args) {
// TODO Auto-generated method stub
TornadoFrame frame = new TornadoFrame();
frame.setTitle("EF Scale");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
这是我创建框架并尝试添加龙卷风的地方:
public class TornadoFrame extends JFrame{
private JButton submit;
private JLabel label;
static JLabel errorLabel;
static JTextField textBox;
JPanel tornado = new TornadoComponent();
private static final int FRAME_WIDTH = 400;
private static final int FRAME_HEIGHT = 300;
//Constructor for the frame
public TornadoFrame() {
super();
setSize(FRAME_WIDTH, FRAME_HEIGHT);
createComponents();
}
private void createComponents()
{
textBox = new JTextField(" ");
submit = new JButton("Submit");
label = new JLabel("Please enter a windspeed:");
errorLabel = new JLabel("Error Message " );
JPanel panel = new JPanel();
panel.add(label);
panel.add(textBox);
panel.add(submit);
panel.add(errorLabel);
panel.add(tornado);
add(panel);
}
}
我知道这是可行的,但我可能遗漏了一些东西,所以这里是我创建龙卷风的地方:
public class TornadoComponent extends JPanel {
public void paintComponent(Graphics g) {
int[] xPoints = {100,200,0};
int[] yPoints = {0,200,200};
int nPoints = 3;
g.drawPolygon(xPoints, yPoints, nPoints);
}
}
您必须设置 JPanels 大小才能显示图形。
static class TornadoComponent extends JPanel {
public TornadoComponent() {
setPreferredSize(new Dimension(500, 500));
}
@Override
public void paintComponent(Graphics g) {
//Whatever
}
}
并且为了触发 paintComponent(Graphics g)
,您必须在 createComponents()
函数的末尾添加 tornado.repaint();
。
private void createComponents() {
//All your components
panel.add(tornado);
add(panel);
tornado.repaint();
}
现在显示了多边形,但不在正确的位置(稍微偏离图像)
因此我们必须稍微安排一下您的 JPanel:
private void createComponents() {
textBox = new JTextField(" ");
submit = new JButton("Submit");
label = new JLabel("Please enter a windspeed:");
errorLabel = new JLabel("Error Message " );
JPanel upper = new JPanel();
upper.setLayout(new BoxLayout(upper,BoxLayout.X_AXIS));
upper.add(label);
upper.add(textBox);
upper.add(submit);
upper.add(errorLabel);
JPanel lower = new JPanel();
lower.setLayout(new BoxLayout(lower,BoxLayout.X_AXIS));
lower.add(tornado);
JPanel over = new JPanel();
over.setLayout(new BoxLayout(over,BoxLayout.Y_AXIS));
over.add(upper);
over.add(lower);
add(over);
tornado.repaint();
}
基本上我做一些盒子...
Over
Upper
... your stuff with text
Lower
Our tornado
现在我们的龙卷风方向错了...
int[] xPoints = {100,200,150};
int[] yPoints = {0,0,150};
瞧瞧:
我们刚刚创建了一个非常基本的龙卷风,它没有瞄准任何东西:)
如果你以后想改变龙卷风的位置,你只需要调用 tornado.repaint();
就可以了。