- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想得到 Frame(640x640) 和 DrawCanvas(960x960) ,如下所示:
所以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());
}
}
请注意,左上角位于 2, 2,而不是 0, 0
关于java - 将组件放入较小的组件内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44346747/
是否可以告诉hive某个表“很小”,即应将其复制到所有节点并在RAM中进行操作? 最佳答案 尝试以下提示: /*+ MAPJOIN(small_table) */ UPDATE 顺便说一句,还有其他
给定的是一个大(但不是巨大)的字符串数组(数量为 1000-5000 个单个字符串)。我想对这些字符串执行一些计算和其他操作。因为在处理那个大数组时它总是停止工作,所以我重写了我的函数以递归地获取较小
当我在大小为 (640,480) 的 JFrame 中添加 JPanel 时,JPanel 的大小为 (638449)。我需要 JPanel 与 JFrame 完全匹配! 我发现的一个临时解决方法是将
我目前正在尝试响应设计。我需要在父 div 变小的同时保持图像居中。 见图片说明: 我不想用它作为背景。下面的代码会一直把它放在div框的左上角 #img_wrap {
当我必须捕获生成器中可能发生的异常时,如何使 try block 尽可能小? 典型的情况是这样的: for i in g(): process(i) 如果 g() 可以引发我需要捕获的异常,第一种
目前尝试让 Accordion 项目在 Bootstrap 中工作一切都很好,直到我尝试关闭所有 Accordion 菜单。突然之间,标题比未折叠时小得多。 当一个打开时 当全部关闭时 我正在使用指南
目前尝试让 Accordion 项目在 Bootstrap 中工作一切都很好,直到我尝试关闭所有 Accordion 菜单。突然之间,标题比未折叠时小得多。 当一个打开时 当全部关闭时 我正在使用指南
一个应用程序托管一个具有三个接口(interface)的 Web 服务,用于三个单独且独立的操作,所有这些操作都在应用程序的不同组件中实现,彼此独立,例如在不同的包等中,所以他们对彼此了解不多,只共享
我正在尝试使用 border-radius 属性设计一个主要内容容器具有圆 Angular 的网站。但是,我保持侧边栏和顶部导航栏固定,因此当用户向上或向下滚动时它们不会移动。它类似于在 Google
我正在构建我网站的响应式版本。 虽然我很高兴大多数 float 的 div 被迫在屏幕下方,但有一些 div 我需要保持彼此相邻,即使屏幕区域小于这些 div 的总宽度。在这种情况下,我想按比例缩小它
我正在为我的元素使用 Twitter Bootstraps 网格。我有以下 HTML: Some text Some text
我有一个小宽度的 div 并且可以看到溢出。我有一个更大的表,里面只有一个单元格和一个文本: A small text with spaces...
我有一个设计得很好的架构,其中 Controller 转到访问与数据库通信的存储库的服务。 因此, Controller 中的逻辑保持在最低限度,但我仍然有非常微妙的代码片段来执行一些任务,例如 验证
我在一个布局中有两个 View 。我将分别称它们为 View A 和 View B。 ┌──────┐ │┌─┐┌─┐│ ││A││B││ │└─┘└─┘│ └──────┘ 父布局(包括View A
整个页面的父元素是一个居中的 div,最大宽度限制为 960px。页面上的所有其他元素都是该父 div 的子元素。简化结构如下: 虽然父 div 的宽度不应超过 960px,但我
我应该链接到完整的 jQuery UI -还是-提供精简的自定义副本? 来自 Google 等 CDN 的完整 jQuery-UI 与提供定制的最小版本之间存在非常显着的大小差异。此外,还可以将 jQ
我正在尝试制作一条图像拇指的“线”,它在鼠标移动时滚动。我让它工作了,但我现在的问题是我想在侧面做一个“填充”,这样我就不必将鼠标一直拉到侧面才能看到第一个/最后一个拇指。但我真的无法让它工作:/ 这
我是一名优秀的程序员,十分优秀!