有几次我因为建议使用以下方法而受到批评:
在Swing组件上.当我想在显示的组件之间定义比例时,我没有看到任何替代它们的用法.我被告知这个:
对于布局,答案总是相同的:使用合适的LayoutManager
我在网上搜索了一下,但我没有找到任何关于这个主题的综合分析.所以我有以下问题:
在StackOverflow上有很多次用户问这样的问题......
我有一个
JPanel包含孩子的主人JPanel.当用户单击按钮时,孩子JPanel应该更改为其他JPanel.我怎样才能做到这一点.
通常,用户实际上已尝试实现此问题,但无法使其正常工作.
每当我回答这个问题时,我都会告诉他们做这样的事情(简单地说)......
JPanel myFrame = new JPanel();
myFrame.remove(oldPanel);
myFrame.add(newPanel);
Run Code Online (Sandbox Code Playgroud)
我认为这是一个非常合理的答案,我个人在我自己的许多Java项目中都没有使用过这个问题.但是,我总是得到我的回答,每个人只是说"使用CardLayout".
所以我的问题是,为什么每个人都如此着迷CardLayout,以至于我的答案值得进行投票?为什么我应该CardLayout使用上面的代码选择使用而不是添加/删除面板?
作为进一步的问题,您是否仍然建议CardLayout使用具有动态JPanel的接口.例如,我的大多数程序都实现了一个自定义插件框架,其中可能有数百个JPanels,但我只是加载并显示实际需要的面板.对于程序的正常使用,大多数面板实际上永远不会被加载或需要.对于这种类型的场景,我的编码方法是否是最好的解决方案,据我所知,这CardLayout将需要我实际创建所有的,JPanels即使大多数永远不会被使用?
我有一个快速的问题.
我对Swing有一点经验,最简单的方法是绘制一个相当大的GUI.
作为GUI的一部分,我想要前进和后退按钮.我试图采用的方法是实现将当前JPanel推送到堆栈并检索前一个值的方法(在前向或反向(因此为2个堆栈)).我不能让它工作.也许我会以完全错误的方式解决它,或者堆栈不能以我使用它的方式使用.在任何一种情况下,它真的让我烦恼.我想有可能更简单的方式,如卡布局,但我认为这种方法应该工作,这是非常烦人的.
值得注意的是,我正在使用JFrame"基类"并根据屏幕更改中央JPanel.然而,导航栏是常量,作为"基类"的一部分
这个"基类"的代码:
public class Main_Frame extends JFrame{
static JPanel nav_bar_panel;
JButton home;
JButton back;
JButton forward;
JPanel currentPanel;
static Stack<JPanel> previousPanels;
static Stack<JPanel> forwardPanels;
public Main_Frame(){
super("DEMO");
setSize(800,600);
setLayout(new BorderLayout());
setVisible(true);
add(nav_bar(), BorderLayout.NORTH);
currentPanel = init_display();
add(currentPanel, BorderLayout.CENTER);
previousPanels = new Stack<JPanel>();
forwardPanels = new Stack<JPanel>();
}
private JPanel nav_bar(){
ButtonPressHandler handler = new ButtonPressHandler();
nav_bar_panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 10));
back = new JButton("Back");
back.addActionListener(handler);
home = new JButton("Home");
home.addActionListener(handler);
forward = new JButton("Forward");
forward.addActionListener(handler); …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序产生几个全屏 - 无装饰框架(基本上控制所有屏幕空间).我的问题是,某些帧上的某些按钮被设计为"切换屏幕",这基本上意味着显示另一帧而不是当前帧.
我在Windows中使用以下方法轻松实现了这一目标:
target.setVisible(true);
target.requestFocus();
this.parent.setVisible(false);
Run Code Online (Sandbox Code Playgroud)
target我要切换到的框架在哪里.这是有效的,因为最初,我将所有帧设置为除了第一个"主"帧之外不可见.
现在,当我将其移植到Linux环境中时,在更改帧时会出现一个丑陋的"闪烁".在这一瞬间,我可以看到我的桌面背景和我在应用程序后面存在的任何打开的窗口.我之前在Windows中遇到过这个问题并通过聚焦目标帧来修复它,然后使旧的不可见.
关于如何解决这个Linux特定问题的任何想法?
编辑:
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setUndecorated(true);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(0,0,screenSize.width, screenSize.height);
this.getContentPane().setLayout(null);
setVisible(true);
validate();
Run Code Online (Sandbox Code Playgroud) 我有一个使用CardLayout的类,它有两张卡片,上面有一个按钮.我希望能够做的是放置一个像背景一样的图像,例如Windows中的桌面背景.该程序最终将有几张不同的卡片,我希望能够在每张卡片上放置不同的背景.我已尝试过在本网站上提出的其他类似问题中提出的许多建议,以及通过Google搜索我能找到的任何建议,但我似乎无法让它发挥作用.我知道使用CardLayout我不能将面板放在面板上,因此将图像放在JPanel上是行不通的.所以我的问题是,根据下面发布的代码,我有更好的方法来设置我的布局,以便它更好地工作,而且,我应该如何处理显示图像,使其在按钮的背景中?任何帮助将不胜感激.
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
public class Cards implements ActionListener {
private JPanel cards;
private JButton button1;
private JButton button2;
private Image backgroundImage;
public void addComponentToPane(Container pane) throws IOException {
backgroundImage = ImageIO.read(new File("background.jpg"));
//create cards
JPanel card1 = new JPanel()
{
@Override
public void paintComponent(Graphics g)
{
g.drawImage(backgroundImage, 0, 0, null);
}
};
JPanel card2 = new JPanel();
button1 = new JButton("Button 1");
button2 = new JButton("Button 2");
button1.addActionListener(this);
button2.addActionListener(this);
card1.add(button1); …Run Code Online (Sandbox Code Playgroud) 我已经开始使用netbeans处理Java桌面应用程序了.我有7个不同的屏幕,代表我正在使用它们JPanel.一个JPanel代表它们,一个代码包含所有它们(命名为mainPanel),它位于JFrame中.mainPanel Cardlayout用于在屏幕之间切换(JPanels).我使用netbeans ui小部件构建了所有这个接口,即拖放.
布局
JFrame
mainPanel (Jpanel) CardLayout
Child1 (JPanel)
Child2 (JPanel)
.
.
.
.
Childn (Jpanel)
Run Code Online (Sandbox Code Playgroud)
我知道可以使用JPanel.next()和切换屏幕Jpanel.previous.但它们只能在连续屏幕之间进行切换时使用,即如果必须切换到直接邻居.还有一个方法JPanel.show()去一个特定的屏幕,但问题是,它需要一个参数name是一个String关联时,当你添加它来的mainPanel JPanel.add()功能.我已经使用拖放添加了所有内容,所以我不知道是什么String关联,如果有的话.虽然它看起来非常原始,但我已经完成了它,Cardlayout但这一次,Cardlayout是一个要求.
帮助将受到高度赞赏