0

やあみんな、私は JScrollPane を作成したかったのですが、うまくいきません...そして、理由がわかりません...これが私のコードです...

public class test extends JFrame{
    public test(){      
        setSize(1000,600);

    }

    private static JButton[] remove;
    private static JPanel p = new JPanel();

    public static void main(String[]args){
        p.setLayout(null);
        JFrame t=new test();
        remove = new JButton[25];
        for(int i=0;i<25;i++){
            remove[i]=new JButton("Remove");
            remove[i].setBounds(243,92+35*i,85,25);
            p.add(remove[i]);       
        }
        JScrollPane scrollPane = new JScrollPane(p);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        t.add(scrollPane);
        t.setVisible(true);
    }

ええと、フレームがこれらの 25 個のボタンに対して十分な大きさではないことは確かです...しかし、それを削除すると、p.setLayout(null);水平スクロールバーが自動的に作成されます...コードの何が問題なのか本当にわかりません... Plsはどうもありがとうございました!

4

2 に答える 2

3

これを機能させるには、p の preferredSize を設定する必要があります。

  p.setPreferredSize(new Dimension(800, 2000));

または、p を JPanel に拡張してから、getPreferredSize() メソッドをオーバーライドして適切なサイズを返すようにすることもできます。

そして私も同意します - null レイアウトを取り除きます。Swing を正しく使用し、堅牢な Swing GUI を使用したい場合は、レイアウト マネージャーについて学び、使用してください。

例えば、

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

public class Foo extends JFrame {

   private static final int BUTTON_COUNT = 25;

   public static void main(String[] args) {
      JPanel btnPanel = new JPanel(new GridLayout(0, 1, 0, 20));
      btnPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
      AbstractAction removeAction = new AbstractAction("Remove") {

         @Override
         public void actionPerformed(ActionEvent evt) {
            JButton src = (JButton) evt.getSource();
            JPanel container = (JPanel) src.getParent();
            container.remove(src);
            container.revalidate();
            container.repaint();
         }
      };
      for (int i = 0; i < BUTTON_COUNT; i++) {
         JButton removeBtn = new JButton(removeAction);
         btnPanel.add(removeBtn);
      }
      JPanel borderPanel = new JPanel(new BorderLayout());
      borderPanel.add(btnPanel, BorderLayout.NORTH);
      JScrollPane scrollpane = new JScrollPane(borderPanel,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
      scrollpane.setPreferredSize(new Dimension(400, 800));

      JFrame frame = new JFrame("Foo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(scrollpane);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

}
于 2012-06-12T00:56:17.770 に答える
0

問題は、スクロール ペインが内部のコンポーネントの「優先サイズ」をチェックするため、null レイアウトのペインの優先サイズが (0,0) になることです。それは無視します。

次の行に沿って何かを行う必要があります。

p.setPreferredSize(1000,600);

いくつかのスクロール バーが表示されるはずですが、どれだけ正確かはわかりません。

于 2012-06-12T00:51:01.800 に答える