0

私は自分の問題に対する答えを徹底的に検索しました(と思います)。私は初心者なので、何を探したらいいのかわからないかもしれません。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 だけが表示されますが、JLabels は表示されません。どんな助けでも大歓迎です。

4

1 に答える 1

1

は、すべてのラベルが追加される前に呼び出されるため、 には表示されJLabelません。その結果、これらのコンポーネントは検証されていないため、表示されませんJAppletJFrame#pack

解決策は、呼び出す前にメソッドを呼び出すことですsetVisible

testFrame.pack();
testFrame.setVisible(true);

ただし、これを行うとアプレット ウィンドウ自体が表示されなくなるため、さらに変更が必要です。これは、ステートメント

testFrame.getContentPane().add(testPanel);

JPanel testPanel前のステートメントで実装されているように、 が置き換えられます。

testFrame.getContentPane().add(demo); 

BorderLayoutその場所には 1 つのコンポーネントのみを含めることができCENTERます。

修正するには、 を削除し、代わりにコンポーネントを に直接testPanel追加します。JLabelJApplet demo

また追加

super.paint(g);

paint確実にJLabelsSwing でペイントする方法に。


もちろんpaint、Swing でのカスタム ペインティングには決して使用しないでください。むしろ使うpaintComponent

今後の課題として、代わりにベース クラスを使用し、オーバーライドして、paint機能を置き換えるようにしてください。を呼び出すことを忘れないでください。カスタム ペインティングの実行で説明されている手順に従います。JComponentpaintComponentsuper.paintComponent(g)

于 2013-08-01T21:17:41.263 に答える