簡體   English   中英

Java JScrollPane ve

[英]Java JScrollPane ve

我想制作一個Java代碼,可以在其中插入任意數量的面板。 這樣我就可以向下滾動以查看面板。 我現在為止很遠:但是我的問題是,我無法向下滾動。 我用JTextAreas測試了JScrollPane,它工作得很好。

我的程序圖片

package test;

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

public class Scrollbar {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        JPanel panel3 = new JPanel();
        JTextField tFId = new JTextField("ID: ", 5);
        JTextField tFName = new JTextField("Name: ", 5);
        JTextField tFHersteller = new JTextField("Hersteller: ", 5);
        JTextField tFId2 = new JTextField("ID: ", 5);
        JTextField tFName2 = new JTextField("Name: ", 5);
        JTextField tFHersteller2 = new JTextField("Hersteller: ", 5);
        JTextField tFId3 = new JTextField("ID: ", 5);
        JTextField tFName3 = new JTextField("Name: ", 5);
        JTextField tFHersteller3 = new JTextField("Hersteller: ", 5);

        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());

        panel.setLayout(new FlowLayout());
        panel.setPreferredSize(new Dimension(200, 85));
        panel.add(panel1);
        panel.add(panel2);
        panel.add(panel3);
        JScrollPane scrollPanel = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        panel1.setLayout(new FlowLayout());
        panel1.add(tFId);
        panel1.add(tFName);
        panel1.add(tFHersteller);

        panel2.setLayout(new FlowLayout());
        panel2.add(tFId2);
        panel2.add(tFName2);
        panel2.add(tFHersteller2);

        panel3.setLayout(new FlowLayout());
        panel3.add(tFId3);
        panel3.add(tFName3);
        panel3.add(tFHersteller3);

        frame.add(scrollPanel);
        frame.setVisible(true);
    }
}

您正在過度使用FlowLayout。

不同的布局具有不同的行為。 首先,您需要刪除以下行:

frame.setLayout(new FlowLayout());

框架內容窗格的默認布局是BorderLayout。 您希望以這種方式保留它,因為添加到BorderLayout且沒有任何約束的組件將放置在中心,該組件將在其中伸展以填充整個空間。

其次,您要刪除這些:

panel.setLayout(new FlowLayout());
panel.setPreferredSize(new Dimension(200, 85));

設置首選大小會干擾JScrollPane管理其視圖(即panel )的能力。 當您希望組件顯示在多行中時,應嘗試通過限制FlowLayout的寬度來強制執行它。 而是使用旨在將組件放置在不同行上的布局。 最好的選擇是GridBagLayout

panel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
panel.add(panel1, gbc);
panel.add(panel2, gbc);
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.NORTH;
panel.add(panel3, gbc);

在約束中使用GridBagConstraints.REMAINDER將告訴GridBagLayout使子組件占據整個行。

weighty = 1的使用告訴GridBagLayout當面板大於其子項時,要添加的子項的網格單元應占用所有額外的垂直空間。 最后,無論網格單元有多高,GridBagConstraints.NORTH都將其子項放置在拉伸網格單元的頂部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM