gpt4 book ai didi

java - 将组件放入较小的组件内

转载 作者:行者123 更新时间:2023-12-01 17:56:31 26 4
gpt4 key购买 nike

我想得到 Frame(640x640) 和 DrawCanvas(960x960) ,如下所示: enter image description here

所以DrawCanvas部分必须隐藏并且框架居中。我应该选择什么布局?现在我将 DrawCanvas 放入框架内,如下所示:

    class extends JFrame {
canvas = new DrawCanvas();
canvas.setPreferredSize(new Dimension(960, 960));
Container cp = getContentPane();
cp.add(canvas);
setPreferredSize(new Dimension(640, 640));
}

最佳答案

正如您在上一个问题中所述,实现此目的的一种方法是将内部组件嵌入 JScrollPane 中,但去掉滚动 Pane 的滚动条。

例如,假设您有一个名为 DrawPanel 的类,它扩展了 JPanel 并包含 12 x 12 的单元格网格,但您只想显示其中的 8 x 8 个单元格。您可以让此类实现 Scrollable 接口(interface),使其 getPreferredScrollableViewportSize 方法返回您想要显示的尺寸,而其 getPreferredSize 方法将返回组件的实际尺寸:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Rectangle;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Scrollable;

@SuppressWarnings("serial")
public class DrawPanel extends JPanel implements Scrollable {
public static final int VISIBLE_ROW_COUNT = 8;
private static final int ROW_COUNT = 12;
private static final Color DARK_COLOR = Color.DARK_GRAY;
private static final Color LIGHT_COLOR = Color.WHITE;
private int cellWidth;

public DrawPanel(int cellWidth) {
super(new GridLayout(ROW_COUNT, ROW_COUNT));
this.cellWidth = cellWidth;
Dimension prefSize = new Dimension(cellWidth, cellWidth);
for (int i = 0; i < ROW_COUNT; i++) {
for (int j = 0; j < ROW_COUNT; j++) {
JPanel cell = new JPanel();
cell.setPreferredSize(prefSize);
Color c = i % 2 == j % 2 ? DARK_COLOR : LIGHT_COLOR;
cell.setBackground(c);
add(cell);

// TODO: delete the code below. For demo/debug purposes only
String text = String.format("[%d, %d]", j, i);
JLabel label = new JLabel(text);
c = c == DARK_COLOR ? LIGHT_COLOR : DARK_COLOR;
label.setForeground(c);
cell.add(label);
// TODO: end delete block
}
}
}

@Override
public Dimension getPreferredScrollableViewportSize() {
Dimension viewportSize = new Dimension(VISIBLE_ROW_COUNT * cellWidth, VISIBLE_ROW_COUNT * cellWidth);
return viewportSize;
}

@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation,
int direction) {
return cellWidth;
}

@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}

@Override
public boolean getScrollableTracksViewportWidth() {
return false;
}

@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation,
int direction) {
return 1;
}

// note that getPreferredSize already returns the size of the 12 x 12 grid
// since it is composed of a grid sized JPanels

}

然后您可以将其放入 JScrollPane 中,

private static final int CELL_WIDTH = 80;
private DrawPanel drawPanel = new DrawPanel(CELL_WIDTH);
private JScrollPane drawPanelScrollPane = new JScrollPane(drawPanel);

去掉滚动条,

    drawPanelScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
drawPanelScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);

并将其滚动到您想要左上角的位置:

    int x = 2 * CELL_WIDTH;
int y = x;
Point pt = new Point(x, y);
drawPanelScrollPane.getViewport().setViewPosition(pt);

示例 GUI:

import java.awt.BorderLayout;
import java.awt.Point;

import javax.swing.*;

@SuppressWarnings("serial")
public class FrameAGrid extends JPanel {
private static final int CELL_WIDTH = 80;
private DrawPanel drawPanel = new DrawPanel(CELL_WIDTH);
private JScrollPane drawPanelScrollPane = new JScrollPane(drawPanel);

public FrameAGrid() {
drawPanelScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
drawPanelScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
setLayout(new BorderLayout());
add(drawPanelScrollPane);

int x = 2 * CELL_WIDTH;
int y = x;
Point pt = new Point(x, y);
drawPanelScrollPane.getViewport().setViewPosition(pt);
}


private static void createAndShowGui() {
FrameAGrid mainPanel = new FrameAGrid();

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

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}

这显示为: enter image description here

请注意,左上角位于 2, 2,而不是 0, 0

关于java - 将组件放入较小的组件内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44346747/

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