最近,我部署了 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 应用于整个窗口,这样万一有一些组件无法显示,我可以轻松访问它们。
通过应用
setPreferredSize()
方法设置 JScrollPane 可以跟踪的大小来解决问题。
感谢解说员
user85421
。