4

フォームにjScrollPaneとボタンがあります。ボタンは、コンポーネントをに追加しますjScrollPaneFlowLayout内にコンポーネントを配置するために、中央揃えのを使用していjScrollPaneます。

最初のコンポーネントは表示に問題がなく、完全に位置合わせされています。その後、もう一度ボタンを押すと、何も起こらないようです。デバッガーをフォローすると、すべてが以前とまったく同じように行われることが示されます。

ボタンがクリックされたときに実行されるコード:

jScrollPane.getViewport().add(new Component());

これは私が上のを設定するFlowLayout方法ViewportですjScrollPane

jScrollPane.getViewport().setLayout(new FlowLayout(FlowLayout.CENTER));
4

1 に答える 1

8

重い (AWT) コンポーネントと軽量 (Swing) コンポーネントを混在させています。これらはうまく連携しない傾向があるため、これはお勧めできません。

JScrollPaneJViewPortには、子コンポーネント (別名ビュー) を追加できる が含まれています。

ここに画像の説明を入力

( JavaDocsの画像)

そのため、呼び出しjScrollPane.getViewport().setLayout(new FlowLayout(FlowLayout.CENTER));は実際にはJViewPortのレイアウト マネージャーを設定していますが、これは実際にはお勧めできません。

スクロールペインに追加するコンポーネントを作成し、そのレイアウトを設定し、すべての子コンポーネントを追加してからスクロールペインに追加する必要があります。必要に応じて、後の段階で「ビュー」にコンポーネントを追加できますが、それはあなた次第です...

// Declare "view" as a class variable...
view = new JPanel(); // FlowLayout is the default layout manager
// Add the components you need now to the "view"
JScrollPane scrollPane = new JScrollPane(view);

これで、必要に応じて新しいコンポーネントをビューに追加できます...

view.add(...);

への参照を保持したくない場合はview、 を呼び出すことJViewport#getViewでアクセスできます。これにより、ビュー ポートによって管理されているコンポーネントが返されます。

JPanel view = (JPanel)scrollPane.getViewPort().getView();

実施例

これは私にとってはうまくいきます...

nb-view.validate()新しいコンポーネントを追加した後、あなたが持っていなかったかもしれないコードに追加しました...

public class TestScrollPane01 {

    public static void main(String[] args) {
        new TestScrollPane01();
    }

    public TestScrollPane01() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new MainPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MainPane extends JPanel {

        private JScrollPane scrollPane;
        private int count;

        public MainPane() {
            setLayout(new BorderLayout());
            scrollPane = new JScrollPane(new JPanel());
            ((JPanel)scrollPane.getViewport().getView()).add(new JLabel("First"));
            add(scrollPane);

            JButton add = new JButton("Add");
            add.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JPanel view = ((JPanel)scrollPane.getViewport().getView());
                    view.add(new JLabel("Added " + (++count)));
                    view.validate();
                }
            });

            add(add, BorderLayout.SOUTH);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}
于 2013-01-04T02:54:00.470 に答える