如何在 JFrame 中的 JScrollPane 底部显示按钮
How to show the Button in the bottom of the JScrollPane Inside a JFrame
我正在开发一个试图在 JFrame 中显示横幅的应用程序。在 JFrame 内部,我使用了一个 JScrollbar,它使用 JEditorPane 来显示 HTML 页面的内容。
public static JFrame ShowBanner() throws IOException {
int width = 0;
int height = 0;
String urlText = null;
String ScrnResol = getScreenResolution();
String[] ScreenResolution = ScrnResol.split(",");
try {
width = Integer.parseInt(ScreenResolution[0]);
height = Integer.parseInt(ScreenResolution[1]);
} catch (NumberFormatException nfe) {
logger.error("NumberFormatException: " + nfe.getMessage());
}
//Creating Frame
frmOpt = new JFrame("Banner");
frmOpt.setExtendedState(JFrame.MAXIMIZED_BOTH);
frmOpt.setPreferredSize(new Dimension(width, height));
frmOpt.setUndecorated(true);
frmOpt.setBackground(new Color(1.0f, 1.0f, 1.0f, 0.1f));
frmOpt.setVisible(true);
frmOpt.setAlwaysOnTop(true);
frmOpt.setLocationRelativeTo(null);
//bringToForeground(getHWND(frmOpt));
JPanel panel = new JPanel();
LayoutManager layout = new FlowLayout();
panel.setLayout(layout);
JEditorPane jEditorPane = new JEditorPane();
jEditorPane.setEditable(false);
try {
String urlText=IOUtils.toString(BringUpFrame.class.getClassLoader().getResourceAsStream("banner.htm"));
jEditorPane.setContentType("text/html");
jEditorPane.setText(urlText);
} catch (Exception e) {
logger.error("Exception while executing showBanner: {}", e);
jEditorPane.setContentType("text/html");
jEditorPane.setText("<html>Page not found.</html>");
}
JScrollPane jScrollPane = new JScrollPane(jEditorPane);
scrollPane.setColumnHeaderView(createButton());
jScrollPane.setPreferredSize(new Dimension(width, height));
panel.add(jScrollPane);
frmOpt.add(panel);
frmOpt.pack();
frmOpt.setVisible(true);
return frmOpt;
}
private static JPanel createButton() {
JPanel panel = new JPanel();
panel.setBackground(new Color(1.0f, 1.0f, 1.0f, 0.1f));
JButton button = new JButton("Close");
panel.add(button);
return panel;
}
当前视图如下所示:
截至目前按钮显示在顶部。我想要做的是将按钮放在屏幕底部。我尝试了一些布局(BoxLayout 和 BorderLayout),但视图符合预期。我可以理解这将是一个小的变化,但我在 Swing 编程方面没有太多经验。
有人可以建议我怎样才能做到这一点。
编辑:
尝试了建议的更改:
JScrollPane jScrollPane = new JScrollPane(jEditorPane);
panel.add(jScrollPane);
frmOpt.add(panel,BorderLayout.CENTER);
frmOpt.add(createButton(),BorderLayout.PAGE_END);
但它并没有像预期的那样出现。 JscrollPane 中的按钮和 html 页面显示完全分开,页面也没有完全显示。
谢谢,
JFrame
[内容窗格]的默认布局管理器是BorderLayout
。中心组件占据了所有剩余的 space。因此 BorderLayout
忽略了中心组件的首选大小。另一方面,FlowLayout
尊重其包含的组件的首选大小。由于您已将 JFrame
最大化,其中心组件将几乎占据整个屏幕,因此您只需将 JScrollPane
添加到 BorderLayout
中心即可。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class ForManish {
private void createAndDisplayGui() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);
frame.add(createScrollPane(), BorderLayout.CENTER);
frame.add(createButtonPanel(), BorderLayout.PAGE_END);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}
private JScrollPane createScrollPane() {
JEditorPane editorPane = new JEditorPane("text/html", "<h1 align=\"center\">Checkout unavailable");
editorPane.setBackground(new Color(1.0f, 1.0f, 1.0f, 0.1f));
JScrollPane scrollPane = new JScrollPane(editorPane);
scrollPane.setBorder(BorderFactory.createLineBorder(new Color(1.0f, 1.0f, 1.0f, 0.1f)));
return scrollPane;
}
private JPanel createButtonPanel() {
JPanel buttonPanel = new JPanel();
buttonPanel.setBackground(new Color(1.0f, 1.0f, 1.0f, 0.1f));
JButton closeButton = new JButton("Close");
buttonPanel.add(closeButton);
return buttonPanel;
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> new ForManish().createAndDisplayGui());
}
}
我正在开发一个试图在 JFrame 中显示横幅的应用程序。在 JFrame 内部,我使用了一个 JScrollbar,它使用 JEditorPane 来显示 HTML 页面的内容。
public static JFrame ShowBanner() throws IOException {
int width = 0;
int height = 0;
String urlText = null;
String ScrnResol = getScreenResolution();
String[] ScreenResolution = ScrnResol.split(",");
try {
width = Integer.parseInt(ScreenResolution[0]);
height = Integer.parseInt(ScreenResolution[1]);
} catch (NumberFormatException nfe) {
logger.error("NumberFormatException: " + nfe.getMessage());
}
//Creating Frame
frmOpt = new JFrame("Banner");
frmOpt.setExtendedState(JFrame.MAXIMIZED_BOTH);
frmOpt.setPreferredSize(new Dimension(width, height));
frmOpt.setUndecorated(true);
frmOpt.setBackground(new Color(1.0f, 1.0f, 1.0f, 0.1f));
frmOpt.setVisible(true);
frmOpt.setAlwaysOnTop(true);
frmOpt.setLocationRelativeTo(null);
//bringToForeground(getHWND(frmOpt));
JPanel panel = new JPanel();
LayoutManager layout = new FlowLayout();
panel.setLayout(layout);
JEditorPane jEditorPane = new JEditorPane();
jEditorPane.setEditable(false);
try {
String urlText=IOUtils.toString(BringUpFrame.class.getClassLoader().getResourceAsStream("banner.htm"));
jEditorPane.setContentType("text/html");
jEditorPane.setText(urlText);
} catch (Exception e) {
logger.error("Exception while executing showBanner: {}", e);
jEditorPane.setContentType("text/html");
jEditorPane.setText("<html>Page not found.</html>");
}
JScrollPane jScrollPane = new JScrollPane(jEditorPane);
scrollPane.setColumnHeaderView(createButton());
jScrollPane.setPreferredSize(new Dimension(width, height));
panel.add(jScrollPane);
frmOpt.add(panel);
frmOpt.pack();
frmOpt.setVisible(true);
return frmOpt;
}
private static JPanel createButton() {
JPanel panel = new JPanel();
panel.setBackground(new Color(1.0f, 1.0f, 1.0f, 0.1f));
JButton button = new JButton("Close");
panel.add(button);
return panel;
}
当前视图如下所示:
截至目前按钮显示在顶部。我想要做的是将按钮放在屏幕底部。我尝试了一些布局(BoxLayout 和 BorderLayout),但视图符合预期。我可以理解这将是一个小的变化,但我在 Swing 编程方面没有太多经验。
有人可以建议我怎样才能做到这一点。
编辑:
尝试了建议的更改:
JScrollPane jScrollPane = new JScrollPane(jEditorPane);
panel.add(jScrollPane);
frmOpt.add(panel,BorderLayout.CENTER);
frmOpt.add(createButton(),BorderLayout.PAGE_END);
但它并没有像预期的那样出现。 JscrollPane 中的按钮和 html 页面显示完全分开,页面也没有完全显示。
谢谢,
JFrame
[内容窗格]的默认布局管理器是BorderLayout
。中心组件占据了所有剩余的 space。因此 BorderLayout
忽略了中心组件的首选大小。另一方面,FlowLayout
尊重其包含的组件的首选大小。由于您已将 JFrame
最大化,其中心组件将几乎占据整个屏幕,因此您只需将 JScrollPane
添加到 BorderLayout
中心即可。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class ForManish {
private void createAndDisplayGui() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);
frame.add(createScrollPane(), BorderLayout.CENTER);
frame.add(createButtonPanel(), BorderLayout.PAGE_END);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}
private JScrollPane createScrollPane() {
JEditorPane editorPane = new JEditorPane("text/html", "<h1 align=\"center\">Checkout unavailable");
editorPane.setBackground(new Color(1.0f, 1.0f, 1.0f, 0.1f));
JScrollPane scrollPane = new JScrollPane(editorPane);
scrollPane.setBorder(BorderFactory.createLineBorder(new Color(1.0f, 1.0f, 1.0f, 0.1f)));
return scrollPane;
}
private JPanel createButtonPanel() {
JPanel buttonPanel = new JPanel();
buttonPanel.setBackground(new Color(1.0f, 1.0f, 1.0f, 0.1f));
JButton closeButton = new JButton("Close");
buttonPanel.add(closeButton);
return buttonPanel;
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> new ForManish().createAndDisplayGui());
}
}