3

JavaSwingで問題が発生しています。上部にいくつかのボタンが入ったコントロールパネルを備えたフレームを作成しようとしています。その下に、JTableに表示させたい

試しましたが、テーブルが表示されません。上部のcontrolPanelを削除すると、表示される場合と表示されない場合があります。JTableのコンストラクター内で使用するコードは同じアプリケーションで提供されるため、ネットワークエラーは発生しません。

public ServerMainFrame(GuiController gc){
    this.gc = gc;
    initGUI();
}

private void initGUI() {
    System.out.println("initiating GUI");
    createFrame();
    addContentPanel();
    addControls();
    //openPopUpServerSettings();
    addSongTable();
}

private void createFrame()
{
    this.setTitle("AudioBuddy 0.1");
    this.setVisible(true);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setSize(800, 600);
    this.setResizable(false);
    this.setLocationRelativeTo(null);
}

private void addContentPanel()
{
    JPanel p = new JPanel();
    p.setLayout(new FlowLayout());
    p.setSize(new Dimension(800, 600));
    this.setContentPane(p);
}

private void addControls()
{
    JPanel controlPanel = new JPanel();
    controlPanel.setLayout(new FlowLayout());
    controlPanel.setBorder(BorderFactory.createLineBorder(Color.black));
    controlPanel.setSize(700,100);

    // Buttons
    JButton play = new JButton("Play");
    JButton pause = new JButton("Pause");
    JButton stop = new JButton ("Stop");
    JButton next = new JButton("Next");
    JButton prev = new JButton("Previous");     
    controlPanel.add(play);
    controlPanel.add(pause);
    controlPanel.add(stop);
    controlPanel.add(next);
    controlPanel.add(prev);

    // Currently playing
    JLabel playing = new JLabel("Currently playing:");
    controlPanel.add(playing);

    JLabel current = new JLabel("Johnny Cash - Mean as Hell");
    controlPanel.add(current);

    this.getContentPane().add(controlPanel);
}

private void addSongTable()
{
    JTable songTable = new JTable(Server.getSongTableModel());
    songTable.setVisible(true);
    JPanel tablePanel = new JPanel();
    tablePanel.setVisible(true);
    tablePanel.add(songTable);
    songTable.repaint();
    this.getContentPane().add(tablePanel);

    JButton btnMulticastList = new JButton("send list to clients");
    btnMulticastList.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            Server.MulticastPlaylist();
        }
    });

    getContentPane().add(btnMulticastList);
}
4

2 に答える 2

5

上部のcontrolPanelを削除すると、表示される場合と表示されない場合があります。

  • すべてがに隠されています。ハードコードされた値が返されるSSCCEServer.getSongTableModel()を投稿しないと誰も知りません。

  • GUIにSwingの同時性に関する問題があります

  • XxxModelがGUiを構築しながらデータを継続的にロードすると、例外が原因で説明された問題が発生しました

JTableのコンストラクター内で使用するコードは同じアプリケーションで提供されるため、ネットワークエラーは発生しません。

  • あなたが何について話しているのか分かりません

  • 空のGUIを作成する必要があります。InitialTreadを参照してください。

  • GUIを表示してから、JTableへのデータのロードを開始します

  • 次に、Workers Thread(Backgroung Task)をからSwingWorkerまたは(ネットワークの問題を説明する)より適切に開始しますRunnable#Thread(例外をキャッチして個別のスレッドを処理するのに適しています)

  • SwingGUIからRunnableの出力はにラップする必要がありますinvokeLater()

于 2012-11-12T12:49:21.183 に答える
5

ウィンドウの上部にコントロールがあり、テーブルがウィンドウの大部分を占めている場合は、のBorderLayout代わりにを使用することをお勧めしますFlowLayout。このように作成してください...

private void addContentPanel()
{
    JPanel p = new JPanel();
    p.setLayout(new BorderLayout());
    p.setSize(new Dimension(800, 600));
    this.setContentPane(p);
}

そして、で場所を指定してコンポーネントを追加しますBorderLayout。この場合、コントロールは最小サイズで上部に追加する必要があります...

this.getContentPane().add(controlPanel,BorderLayout.NORTH);

そして、テーブルは中央にあり、残りのウィンドウスペースを埋める必要があります...

this.getContentPane().add(tablePanel,BorderLayout.CENTER);

あなたの場合、下部にもボタンがあります...

getContentPane().add(btnMulticastList,BorderLayout.SOUTH);

あなたが求めているレイアウトには、BorderLayoutはるかに適切です。ここで使用する利点はBorderLayout、コンポーネントがウィンドウのサイズに自動的にサイズ変更される必要があり、各コンポーネントが存在する場所を明示的に指定するため、パネルが表示されないようにすることです。

また、すべてのメソッドを呼び出す代わりの方法を見つけることをお勧めしますgetContentPane()。たぶん、このようにメインパネルのグローバル変数を保持することを検討してください...

private mainPanel;

private void addContentPanel()
{
    mainPanel = new JPanel(new BorderLayout());
    mainPanel.setSize(new Dimension(800, 600));
    this.setContentPane(mainPanel);
}

add()次に、コンポーネントを追加するときに、パネルを直接参照できます。

最後に、GridLayoutすべてのボタンを配置できるようになり、一貫性を保つために同じサイズになるため、コントロールに使用することもお勧めします。このように定義して、5つのボタンを水平方向に配置できるようにします。

JPanel controlPanel = new JPanel(new GridLayout(5,1));

次に、通常使用しているボタンを追加するだけcontrolPanel.add(button)で、グリッドの次のスロットに追加されます。

詳細については、GridLayoutまたはBorderLayoutについて読むか、レイアウトマネージャーのビジュアルガイドのJavaチュートリアルを参照して、使用できる代替案と状況に最適な代替案を確認してください。ほとんどの場合、より適切なものFlowLayoutが他にもあることがわかったので、一般的には避けようとします。LayoutManager

于 2012-11-12T12:51:03.707 に答える