gpt4 book ai didi

java - 具有与父级宽度匹配并包裹内容高度的子级的 JPanel

转载 作者:行者123 更新时间:2023-11-30 10:53:40 25 4
gpt4 key购买 nike

我正在尝试使 JPanel(“父面板”)的内容从上到下添加,并使每个组件的宽度与父面板的宽度相匹配同时让每个组件的高度包裹内容。内容将动态生成。

这是我想要的样子:

enter image description here

这在 Android 中相当容易做到。我研究了 Swing LayoutManagers,但似乎没有一个是显而易见的选择。我尝试过使用 Boxlayout(垂直),除了面板没有填满父面板的宽度(这使它看起来非常糟糕)之外它可以工作。

感谢任何建议!

编辑:

感谢 camickr 的回答,我明白了。为了防止将来对任何人有所帮助,我提供了我的代码和屏幕截图。

解题代码:

(注意GridBagLayout、BorderLayout的使用和GridBagConstraints的参数)

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test extends JFrame{

private final Color darkGreen = Color.decode("#388E3C");
private final Color green = Color.decode("#4CAF50");
private final Color lightGreen = Color.decode("#C8E6C9");

public static void main(String[] args){
Test test = new Test();
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

int noOfTitles = 4;
int noOfSubTitles = 3;
Random random = new Random();

public Test(){


JPanel parentPanel = new JPanel();
this.setSize(new Dimension(300,800));
this.setContentPane(parentPanel);
parentPanel.setBackground(Color.white);

//Set layout of parent panel to Gridlayout
parentPanel.setLayout(new GridBagLayout());

//Panel for our titles
JPanel titlesPanel = new JPanel();
titlesPanel.setLayout(new BoxLayout(titlesPanel, BoxLayout.Y_AXIS));

for(int i = 0;i<noOfTitles;i++){
//Panel for the subtitles of each title
JPanel subTitlesPanel = new JPanel();
subTitlesPanel.setLayout(new BoxLayout(subTitlesPanel, BoxLayout.Y_AXIS));

for(int j = 0;j<noOfSubTitles;j++){
//Get a panel with a title header, a collapse/uncollapse button and some sample content
subTitlesPanel.add(getCollapsiblePanel(getSampleContent(),"Subtitle"));
subTitlesPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
}
//Get a panel with a title header, a collapse/uncollapse button and the subtitles as content
titlesPanel.add(getCollapsiblePanel(subTitlesPanel,"Title"));
}

//The constraints for the
GridBagConstraints constraints = new GridBagConstraints();
constraints.anchor = GridBagConstraints.PAGE_START;
constraints.fill = GridBagConstraints.HORIZONTAL; //Fill the panels horizontally. A weightx is needed for this to work.
constraints.gridx = 1;
constraints.gridy = 0;
constraints.weightx = 1; //Actually makes it fill
parentPanel.add(titlesPanel,constraints);

//To actually bump the rest of the other stuff to the top,
//we need something below with a weighty > 0
constraints.gridy = 1;
constraints.weighty = 1;
constraints.anchor = GridBagConstraints.PAGE_END;
parentPanel.add(new JLabel(""),constraints);

this.setVisible(true);
}

/*
* Gets a title for the supplied content-panel.
* The title includes the titleText and a button for collapsing/uncollapsing the content.
*/
private JPanel getCollapsiblePanel(JPanel content,String titleText){
JPanel titlePanel = new JPanel(); //Top container for the title
JPanel title = new JPanel(); //collapse/uncollapse button and title text

title.setLayout(new BoxLayout(title,BoxLayout.X_AXIS));
title.add(getToggleVisibilityIcon(content));
title.add(new JLabel(" "+titleText));

//A border layout is needed here for the fill of the parent panel to work
// (I tried with the box layout but it didn't work)
titlePanel.setLayout(new BorderLayout());
titlePanel.add(title,BorderLayout.PAGE_START);
titlePanel.add(content,BorderLayout.CENTER);

//Vanity
title.setBackground(green);
title.setBorder(BorderFactory.createEmptyBorder(1,1,2,1));

return titlePanel;
}

/*
* Not important, just generates a panel with some "sample" strings.
*/
private JPanel getSampleContent(){
JPanel content = new JPanel();
content.setLayout(new BoxLayout(content,BoxLayout.Y_AXIS));
for(int i = 0; i<1+random.nextInt(3); i++){
String sampleContent = "";
for(int j = 0;j<1 + random.nextInt(5);j++){
sampleContent += "sample ";
}
JLabel sample = new JLabel(sampleContent);
sample.setForeground(Color.decode("#111111"));
content.add(sample);
}
content.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
content.setBackground(lightGreen);
return content;
}

/*
* Method that returns a JLabel that will toggle the visibility of the
* supplied content panel upon clicking.
*/
private JLabel getToggleVisibilityIcon(JPanel content){
JLabel icon = new JLabel(" V ");
icon.setBackground(green);
icon.setBorder(BorderFactory.createLineBorder(darkGreen,2));
icon.setOpaque(true);
icon.addMouseListener(new MouseListener(){
private JPanel content;
private JLabel icon;
MouseListener init(JPanel content,JLabel icon){
this.content = content;
this.icon = icon;
return this;
}
@Override
public void mouseClicked(MouseEvent e) {
if(content.isVisible()){
content.setVisible(false);
icon.setText(" > ");
}else{
content.setVisible(true);
icon.setText(" V ");
}
}

@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}.init(content,icon));
return icon;
}
}

正在运行的应用程序的屏幕截图:

enter image description here

最佳答案

不是很理解你的问题。您通常没有随机换行的文本、按钮和组合框。通常面板有布局,因此组件在逻辑上组织。也就是说,您不希望标签带有“名字”之类的文本,后跟一个随机换行到下一行的文本字段。

在我看来,您有一个隐藏或显示的“详细信息面板”?

好吧,您可以使用 BorderLayout 来实现它。因此隐藏/显示按钮将放置在 BorderLayout.PAGE_START 中。然后详细信息面板将位于 BorderLayout.CENTER 中。然后根据需要设置详细信息面板的可见性。

然后顶层容器可以是 GridBagLayout。您可以使用约束让每一行填充单元格的宽度。每个子面板都可以使用 Border 使其在左侧略微缩进。

阅读Swing tutorial .有以下部分:

  1. 如何使用 GridBagLayout 和
  2. 如何使用边框

关于java - 具有与父级宽度匹配并包裹内容高度的子级的 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33919591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com