1

以下のSSCCEは、を拡張するクラスですJPanel。これJPanelはカレンダーの基本的なアウトラインであり(わかりやすくするために省略しました)、JButtonコンポーネント、、、JLabelおよびで構成されていJTableます。このフレームをウィンドウ(つまりJDialog)に追加すると、通常どおりに表示されます。ただし、別のコンポーネントを追加すると、そのコンポーネントは表示されなくなります。なぜこれが起こっているのですか、そしてどうすればこれを起こさないようにすることができますか?

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;

public class CalendarPanel extends JPanel {

    private static JDialog dialog = new JDialog();

    public static void main(String[] args) {

    setDialogProperties();
    addComponentsToDialog();
    dialog.setVisible(true);
    }

    private static void setDialogProperties() {
    dialog.setModal(true);
    dialog.setResizable(false);
    dialog.setSize(new Dimension(330, 400));
    dialog.setDefaultCloseOperation(2);
    dialog.setLocationRelativeTo(null);
    }

    private static void addComponentsToDialog() {
    CalendarPanel calendar = new CalendarPanel();
    JPanel panel = new JPanel();
    panel.add(calendar);

    dialog.add(panel);
    //dialog.add(new JLabel("Hello"));
    }

    private static final long serialVersionUID = 1L;
    private JLabel lblMonth;
    private JButton btnPrev, btnNext;
    private JTable tblCalendar;
    private DefaultTableModel mtblCalendar;
    private JScrollPane stblCalendar;
    private static GridBagLayout gridBag = new GridBagLayout();
    private GridBagConstraints constraints = new GridBagConstraints();

    public CalendarPanel() {

    super(gridBag);

    createControls();
    addControlsToPanel();
    addHeaders();
    setTableProperties();
    }

    private void createControls() {
    lblMonth = new JLabel("January");
    btnPrev = new JButton("<");
    btnNext = new JButton(">");
    mtblCalendar = new DefaultTableModel() {

        public boolean isCellEditable(int rowIndex, int mColIndex) {
        return false;
        }
    };
    tblCalendar = new JTable(mtblCalendar);
    stblCalendar = new JScrollPane(tblCalendar);
    stblCalendar.setPreferredSize(new Dimension(300, 247));
    }

    private void addControlsToPanel() {
    GridBagLayout topGridBag = new GridBagLayout();

    JPanel topPanel = new JPanel(topGridBag);

    JPanel labelPanel = new JPanel();
    labelPanel.add(lblMonth);
    labelPanel.setPreferredSize(new Dimension(180, 20));

    constraints.gridx = 1;
    topGridBag.setConstraints(labelPanel, constraints);

    constraints.gridx = 2;
    topGridBag.setConstraints(btnNext, constraints);

    topPanel.add(btnPrev);
    topPanel.add(labelPanel);
    topPanel.add(btnNext);

    gridBag.setConstraints(topPanel, constraints);

    constraints.gridy = 1;
    gridBag.setConstraints(stblCalendar, constraints);

    this.add(topPanel);
    this.add(stblCalendar);
    }

    private void addHeaders() {
    String[] headers = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
    for (int i = 0; i < 7; i++) {
        mtblCalendar.addColumn(headers[i]);
    }
    }

    private void setTableProperties() {
    tblCalendar.getTableHeader().setReorderingAllowed(false);

    tblCalendar.setRowHeight(38);
    mtblCalendar.setColumnCount(7);
    mtblCalendar.setRowCount(6);
    }
}
4

1 に答える 1

4

JDialogsとすべてのトップレベルウィンドウは、デフォルトでBorderLayoutを使用します。位置を指定せずにコンポーネント(実際にはそのcontentPane)を追加すると、デフォルトでそのコンポーネントがBorderLayout.CENTERの位置に追加されます。新しいコンポーネントを追加するたびに、以前に追加したコンポーネントを隠蔽します。使用可能なレイアウトについて学習し、それらを最大限に活用する必要があります。

例えば、

  dialog.add(panel);
  dialog.add(new JLabel("Hello", SwingConstants.CENTER), BorderLayout.SOUTH);
}

次に、何かのサイズを設定することを避け、pack()これを許可するトップレベルのウィンドウを確認する必要があります。

于 2013-02-26T02:58:00.583 に答える