Tôi có một bảng điều khiển nơi tôi đặt một số bảng nhỏ, cạnh nhau, với các kích cỡ và màu sắc khác nhau và chúng sẽ chiếm toàn bộ bảng điều khiển chính (theo chiều ngang).JPanels không hoàn toàn kéo dài để chiếm không gian có sẵn
Đối với điều này tôi sử dụng BorderLayout (cho bảng điều khiển chính) và BoxLayout cho bảng phụ nơi tôi đặt tất cả các bảng nhỏ (xem mã bên dưới). Nó hoạt động và hoạt động đúng cách thay đổi kích thước và mọi thứ. Tuy nhiên, khi số lượng các bảng thu nhỏ trở nên lớn hơn, một hành vi lạ xảy ra: khoảng trống sẽ xuất hiện ở cuối bảng điều khiển chính.
Tôi nghĩ rằng tôi thấy rằng đây là một lỗi streching trong các nhà quản lý bố trí, bởi vì để strech các pa-nô, người quản lý bố trí cố gắng thêm một điểm ảnh duy nhất để mỗi mini-panel. Tuy nhiên, khi số lượng bảng nhỏ lớn, việc thêm một pixel vào mỗi pixel sẽ dẫn đến việc thêm nhiều pixel và vượt quá kích thước của bố cục. Do đó, trình quản lý bố cục sẽ không thêm bất kỳ pixel nào vào bất kỳ bảng điều khiển mini nào, dẫn đến khoảng trống.
Đây là SSCCE tôi: (thử chạy, và streching cửa sổ, để hiểu được vấn đề)
package com.myPackage;
import java.awt.*;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ColoredPanels extends JPanel
{
/* Content information. */
private Vector<Integer> partitions;
private Vector<Color> colors;
/* Panel where the content panels will go. */
private JPanel contentHolder;
private final int defaultHeight = 20;
public ColoredPanels(Vector<Integer> partitions, Vector<Color> colors)
{
assert partitions != null;
assert !partitions.isEmpty();
assert colors != null;
assert !colors.isEmpty();
assert colors.size() == partitions.size();
this.partitions = partitions;
this.colors = colors;
/* Set layout manager. */
setLayout(new BorderLayout());
/* Create the content holder. */
contentHolder = new JPanel();
contentHolder.setLayout(new BoxLayout(contentHolder, BoxLayout.X_AXIS));
this.add(contentHolder, BorderLayout.NORTH);
/* Fill content holder with colored panels. */
createPanels();
}
private void createPanels()
{
assert partitions != null;
assert !partitions.isEmpty();
assert colors != null;
assert !colors.isEmpty();
assert colors.size() == partitions.size();
for (int i = 0; i < partitions.size(); i++)
{
JPanel newPanel = new JPanel();
newPanel.setBackground(colors.get(i));
newPanel.setPreferredSize(new Dimension(partitions.get(i), defaultHeight));
newPanel.setMinimumSize(new Dimension(1, defaultHeight));
contentHolder.add(newPanel);
}
}
public static void main(String[] in)
{
Vector<Integer> sizes = new Vector<Integer>();
Vector<Color> cols = new Vector<Color>();
/* Make 100 random sizes, and use two colors. */
for (int i = 0; i < 100; i++)
{
int size = (int)Math.round(1 + Math.random() * 10);
sizes.add(size);
cols.add((i%2 == 0)? Color.red : Color.green);
}
ColoredPanels panels = new ColoredPanels(sizes, cols);
panels.setBorder(BorderFactory.createLineBorder(Color.yellow, 1));
JFrame newFrame = new JFrame();
newFrame.getContentPane().add(panels);
newFrame.pack();
newFrame.setVisible(true);
}
}
Làm thế nào để tránh hành vi này? Tôi muốn các tấm của tôi chiếm toàn bộ bình chứa.
CHỈNH SỬA: Các bảng nhỏ được thiết kế để có (một khi điều này được giải quyết) người nghe chuột. Do đó, các giải pháp sơn là không thể tránh khỏi.
rất đẹp SSCCE +1 – mKorbel
thú vị ... bạn sẽ làm gì? Cách dễ nhất (hầu hết không phải là cách tốt nhất :-) sẽ là để cung cấp cho tất cả không gian làm tròn cho ... – kleopatra
Tôi muốn các bảng mini hoàn toàn lấp đầy không gian có sẵn. Việc đưa phần còn lại cho người cuối cùng không phải là một lựa chọn, vì tỷ lệ kích thước phân vùng phải được tôn trọng. – Anoyz