将 JScrollPane 应用于 JFrame

问题描述 投票:0回答:1

最近,我部署了 Java 应用程序以供大规模使用,但一些用户遇到了可访问性问题,因为程序没有考虑屏幕尺寸,尽管我尝试为大多数可以出现在用户屏幕上的 JPanel 设置 JScrollPane。

以下是负责将主面板添加到屏幕的代码片段:主面板充当在中心显示其他面板的容器。

Window window = new Window(); // Window is a JFrame inherited object.
CardLayout cardLayout = new CardLayout();
JPanel mainPanel = new JPanel();
mainPanel.setLayout(cardLayout);

window.add(mainPanel, BorderLayout.CENTER);

// As default panel displayed on the screen I have
// cleanPanel object which contains only application
// title and nothing else
JPanel cleanPanel = new JPanel();
// ...
mainPanel.add(cleanPanel, "NONE");
cardLayout.show(mainPanel, "NONE");

一旦我需要根据用户请求切换屏幕上的面板,我就有这段代码负责(在本例中,它用于 InvoicePanel 对象):

menuBar.fileCreateInvoice.addActionListener((e) -> {
  for (Component component : mainPanel.getComponents()) {
    if (!Objects.equals(component.getName(), "INVOICE")) continue;
    if (JOptionPane.showConfirmDialog(null, Parameters.getBundle().getString("invoiceWarning"), Parameters.getBundle().getString("warning"), JOptionPane.YES_NO_OPTION) != 0) return;
    mainPanel.remove(component);
  }
  InvoicePanel invoicePanel = new InvoicePanel(Parameters.getBundle());
  JScrollPane invoice = new JScrollPane(invoicePanel);
  invoice.setName("INVOICE");
  invoice.setBorder(null);
  mainPanel.add(invoice, "INVOICE");
  cardLayout.show(mainPanel, "INVOICE");
});

基本上,它的作用是检查屏幕上是否已显示现有的 InvoicePanel 对象,如果是,则给出是/否提示。如果用户选择“是”,则旧的 InvoicePanel 对象将被删除,并创建一个新的 InvoicePanel 对象,并在 JScrollPane 内进行敲击。

问题是 JScrollPane 永远不会被触发。如果我调整应用程序的大小而无法看到屏幕底部或其边缘,则 JScrollPane 对象永远不会触发并且永远不会显示滚动条。

我想知道是否可以将 JScrollPane 应用于整个窗口,这样万一有一些组件无法显示,我可以轻松访问它们。

java swing jframe accessibility jscrollpane
1个回答
0
投票

通过应用

setPreferredSize()
方法设置 JScrollPane 可以跟踪的大小来解决问题。

感谢解说员

user85421

© www.soinside.com 2019 - 2024. All rights reserved.