我已经彻底搜索(我认为)以解决我的问题。我是初学者,所以我可能只是不知道该找什么。我试图概述办公室布局(桌子,椅子),我用Graphics2D和GeneralPath编码,JLabels用每个椅子的名字。 如果这已经得到回答我道歉但我确实看了。 (注意:图形现在非常简单:桌子只是一个正方形而椅子只是线条。)
public class DemoReception扩展了JApplet {
@Override
public void paint(Graphics g){
//draws table
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(4.0f));
g2.setColor(Color.BLACK);
int[] xPoints={150,700,700,150};
int[] yPoints={250,250,550,550};
GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD,xPoints.length);
path.moveTo(xPoints[0], yPoints[0]);
for (int i = 0; i < xPoints.length; i++) {
path.lineTo(xPoints[i], yPoints[i]);
}
path.closePath();
g2.draw(path);
//draws chairs
g2.setColor(Color.RED);
path = new GeneralPath(GeneralPath.WIND_NON_ZERO);
path.moveTo(260,240);//Person1
path.lineTo(310,240);
path.moveTo(510,240);//Person2
path.lineTo(560,240);
path.moveTo(260,560);//Person3
path.lineTo(310,560);
path.moveTo(510,560);//Person4
path.lineTo(560,560);
path.closePath();
g2.draw(path);
}
以下是主要方法:
public static void main(String[] args) {
int labelwidth = 50;
int labelheight = 10;
JFrame testFrame = new JFrame("Test Layout");
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JApplet demo = new DemoReception();
testFrame.setBackground(Color.white);
testFrame.getContentPane().add(demo);
testFrame.pack();
testFrame.setMinimumSize(new Dimension(1000,710));
testFrame.setSize(new Dimension(1000,710));
JPanel testPanel = new JPanel();
testPanel.setAlignmentX(0);
testPanel.setAlignmentY(0);
label1 = new JLabel("Person1");
label2 = new JLabel("Person2");
label3 = new JLabel("Person3");
label4 = new JLabel("Person4");
label1.setAlignmentX(260);
label1.setAlignmentY(235);
label1.setSize(labelwidth, labelheight);
label1.setVisible(true);
testPanel.add(label1);
label2.setAlignmentX(510);
label2.setAlignmentY(235);
label2.setSize(labelwidth, labelwidth);
label2.setVisible(true);
testPanel.add(label2);
label3.setAlignmentX(260);
label3.setAlignmentY(565);
label3.setSize(labelwidth, labelwidth);
label3.setVisible(true);
testPanel.add(label3);
label4.setAlignmentX(510);
label4.setAlignmentY(565);
label4.setSize(labelwidth, labelwidth);
label4.setVisible(true);
testPanel.add(label4);
testFrame.getContentPane().add(testPanel);
testFrame.setVisible(true);
}
当我运行它时,我得到的是带有图形的JFrame,但JLabel没有出现。 任何帮助将不胜感激。
答案 0 :(得分:1)
JLabel
JApplet
未显示JFrame#pack
,因为setVisible
在添加所有标签之前调用testFrame.pack();
testFrame.setVisible(true);
。结果是这些组件未经过验证,因此不会出现
解决方案是在调用testFrame.getContentPane().add(testPanel);
JPanel
然而,必须进行进一步的更改,因为完成此操作后applet窗口本身不会出现。这是因为声明
testPanel
将导致testFrame.getContentPane().add(demo);
BorderLayout
移位,如前面的语句
CENTER
testPanel
只能在JLabel
位置包含一个组件。
要修复此问题,请移除JApplet
并将demo
组件直接添加到super.paint(g);
paint
。
同时添加
JLabels
到paint
方法,以确保Swing绘制paintComponent
。
当然paint
永远不应该用于Swing中的自定义绘制。而是使用JComponent
作为未来的练习,请务必使用基于paintComponent
的课程替换super.paintComponent(g)
功能,并覆盖{{1}}。请记得调用{{1}}。按照Performing Custom Painting