JScrollPane视口大于框架

时间:2016-10-15 12:39:03

标签: java swing jscrollpane

我尝试使用动态布局制作一个JFrame,看起来应该是这样的

------------------------------------------| 
|                | Details                |
|                |                        |
|                |                        |
| list           |                        |
|                |                        |
|                |                        |
|                |     save               |
-------------------------------------------

其中list是某种树结构,当我选择一些元素时,元素的细节显示在Details中。现在,详细信息由多个JPanels组成,我将JPanel放入BoxLayout。在JPanel下方,我有一个保存按钮。

由于有很多细节,我将JPanel详细信息放入JScrollPane但是,此scrollPane忽略了其用途,结果是“详细信息”面板大于窗口大小。这是直到底部隐藏保存按钮,其余部分不可见。滚动条永远不会出现。

我不知道是否已经选择了一个元素,我更新了JPanel内的JScrollPane或其他内容。

以下是我实例化所有内容的方法。首先在右侧面板中添加JPanel中的所有firstPanel,然后在JPanel底部放置一个按钮。然后

    setLayout(new BorderLayout());
    add(bottom, BorderLayout.SOUTH);

    scrollPane=new JScrollPane(firstPanel);
    JPanel conScroll = new JPanel(new GridLayout());
    conScroll.add(scrollPane);
    add(conScroll, BorderLayout.CENTER);

JFrame级别,我实例化了左侧和右侧,但是我只将左侧和空JPanel放在右侧,称为display

当我选择一个元素时,我会更新firstPanel中的所有元素,我会在右侧面板上调用revalidate()repaint()。然后在框架级别,我删除displayer的所有元素,然后将右侧添加到displayer

正如所建议的那样,我做了一个最小的工作示例(更新)。

所以对于这个最小的例子,我删除了左侧。剩下的是一个JFrame EmpireEditor,里面有一个显示JPanel,然后在其中放置unitEditor。联合体在中心包含两个JPanel,一个在南部。中心的面板位于JScrollPane中。

package main;

import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;



public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            // Set System L&F
            UIManager.setLookAndFeel(
                    UIManager.getSystemLookAndFeelClassName());
        }
        catch (UnsupportedLookAndFeelException e) {
            // handle exception
        }
        catch (ClassNotFoundException e) {
            // handle exception
        }
        catch (InstantiationException e) {
            // handle exception
        }
        catch (IllegalAccessException e) {
            // handle exception
        }

        @SuppressWarnings("unused")
        EmpireEditor r = new EmpireEditor();
    }
}

EmpireEditor

    package main;

import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class EmpireEditor extends JFrame {

    private JPanel display;
    private UnitEditor unitEditor;

    public EmpireEditor() {
        super("Editor");
        display = new JPanel();
        unitEditor = new UnitEditor();
        add(display);
        display.add(unitEditor);
        pack();
        setVisible(true);
    }
}

这里的UnitEditor是一个中心Pannel,我只用PanelNumber填充,但这只是内部有东西,我们可以看到滚动条没有出现。理念是底部始终存在,其余部分应填充JScrollPane

package main;

import java.awt.BorderLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


@SuppressWarnings("serial")
public class UnitEditor extends JPanel {



    private PanelNumbers numbers = new PanelNumbers();

    private JScrollPane scrollPane;

    public UnitEditor() {
        super();

        JPanel firstPanel = new JPanel();
        firstPanel.setLayout(new BoxLayout(firstPanel, BoxLayout.Y_AXIS));
        firstPanel.add(numbers);

        JPanel bottom = new JPanel();
        JButton save = new JButton("save");

        bottom.add(save);

        scrollPane=new JScrollPane(firstPanel);

        setLayout(new BorderLayout());
        add(scrollPane, BorderLayout.CENTER);
        add(bottom,BorderLayout.SOUTH);
    }
}

最后是PanelNumber但是可以用任何东西交换它。

package main;

import java.awt.GridLayout;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


@SuppressWarnings("serial")
public class PanelNumbers extends JPanel{

    private Map<Value, JFormattedTextField> nums = new HashMap<>();



    public PanelNumbers(){
        super();

        setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));

        JFormattedTextField tmp;
        JPanel numbers;
        numbers = new JPanel();
        numbers.setBorder(BorderFactory.createTitledBorder("Numbers"));
        numbers.setLayout(new GridLayout(0, 6));
        for (Value s : Value.values()) {
            numbers.add(new JLabel(s.n()));
            tmp = new JFormattedTextField(NumberFormat.getInstance());
            setFocus(tmp);
            numbers.add(tmp);
            nums.put(s, tmp);
        }
        add(numbers);
    }

    public void setUnit(String name){
        for (Value key : nums.keySet())
            nums.get(key).setValue(0);
    }

    public void save(){

    }

    private int toNumber(String t) {
        int res = 0;
        try {
            res = Integer.parseInt(t);
        } catch (Exception e) {
        }
        return res;
    }

    private void setFocus(final JFormattedTextField num) {
        num.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        num.selectAll();
                    }
                });
            }
        });
        //num.setPreferredSize(new Dimension(20, 10));
        num.setMaximumSize(num.getPreferredSize());
    }

    public enum Value {
        // Kampf
        GROESSE("Groesse"),
        WAFFENFERTIGKEIT("Waffenfertigkeit"),
        FERNKAMPFFERTIGKEIT("Fernkampffertigkeit"),
        ANGRIFFSBONUS("Angriffs Bonus"),
        NAHKAMPFPANZERUNG("Panzerung nah"),
        FERNKAMPFPANZERUNG("Panzerung fern"),
        INITIATIVE("Initiative"),
        TP("Treffer"),
        // Mouvement
        FELDER("Felder"),
        BWS("Bewegungspunkte"),
        B("B Befehl"),
        A("A Befehl"),
        P("P Befehl"),
        H("H Befehl"),
        M("Manoever"),
        UEBERR("Ueberrenen"),
        //Moral
        FURCHTFAKTOR("Furchtfaktor"),
        MORALERST("Erster Moralwert"),
        MORALZWEIT("Zweiter Moralwert"),
        //Rest
        MAGIE("Magie"),
        KONTROL("Kontrollbereich"),
        STERNE("Sterne"),
        ELEMENTE("Elemente"),
        ELEMENTEPROFELD("Elemente pro Feld"),
        KOSTEN("Kosten");

        private String name;
        Value(String name){
            this.name = name;
        }

        public String n(){
            return name;
        }

    }
}

1 个答案:

答案 0 :(得分:0)

display的布局设置为GridLayout(1,1)解决了这个问题,不知何故原始布局让内部面板变得像它想要的那样大,因此JScrollPane感觉不到强迫自己变小,并有滚动条。