在Java图形界面学习中的一些经验和总结,希望能对您有所帮助

1.如何在JFrame中设置组件位置和大小

JFrame是有默认布局管理器的,默认布局BorderLayout
而在有布局管理器的时候即使你设置组件的大小和位置也是不起作用的。

解决方案:

1. 设置默认布局为null

使用setLayout方法

setLayout(null);

解除布局之后设置组件是有效的

2. 将组件放在JPanel中,再放进JFrame

此时需要注意JPanel也是有默认布局的,默认流式布局FlowLayout,所以在JPanel中也要解除默认布局
示例代码:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestOne extends JFrame{ //JFrame无法设置组件大小位置问题
	private JButton button;
	private JPanel jPanel;

	public TestOne() {
		button = new JButton("退出");
		button.setSize(100, 30);  //设置大小
		button.setLocation(20, 20); //设置位置
		
		jPanel = new JPanel();
		jPanel.add(button);
		jPanel.setSize(500, 500);
		jPanel.setLayout(null);//解除JPanel默认布局
		
		this.add(jPanel);
		setSize(500,500);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new TestOne();
	}
}

运行结果:

java图形界面gui设计 java图形界面常见问题_swing

2.如何解决窗口组件显示不了的问题

出现这种情况通常是因为在加载组件之前使用了setVisible方法,应该在加入组件之后使用。也有时候是因为没有设置组件大小

解决方案:

使用setSize设置组件大小,将setVisible放在最后一行

3.如何解决界面跳转闪屏问题

有时候我们可能需要进行界面间的跳转,例如系统的登录界面,在登录之后时要跳转到另一个新的界面

最简单的实现方法就是添加监听事件,监听到鼠标点击跳转按钮时,使用dispose方法关闭当前界面,再new一个新的界面。但这样做的缺点就是在跳转的时候会出现闪屏的问题

因此在这里我们不应该再去new一个新的窗口,这样做不仅粗糙,代码冗余大,其结构也是不清晰的

解决方案:
在每次跳转的时候我们只更换面板,而不用去换窗口

具体实现,首先我们要有一个原始窗口,这个窗口继承JFrame,将所需的面板放入其中,然后我们还要一个原始面板,继承JPanel/JLayeredPane,这个面板可以作为背景面板,然后就是你所需的其他面板,均继承原始面板,最后在窗口中点击跳转时,使用setContentPane方法更换面板即可

示例代码:
TestFrame类

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class TestFrame extends JFrame implements ActionListener{
	private HomeView homeView;
	private View1 view1;
	private View2 view2;
	private JButton nextButton;
	
	public TestFrame() {
		// TODO Auto-generated constructor stub
		homeView = new HomeView();
		view1 = new View1();
		view2 = new View2();
		nextButton = view1.getjButton();
		nextButton.addActionListener(this);
		
		setContentPane(view1);
		setSize(500,500);
		setLocationRelativeTo(null); 
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new TestFrame();
	}

	@Override
	public void actionPerformed(ActionEvent e) {   //点击事件
		// TODO Auto-generated method stub
		if (e.getSource()==nextButton) { //如果点了按钮
			this.setContentPane(view2);  //就跳到view2
			this.setFocusable(true);
			this.setVisible(true);
		}
	}
}

原始面板类HomeView

import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class HomeView extends JLayeredPane{
	private JPanel jPanel;
	public HomeView() {
		// TODO Auto-generated constructor stub
		ImageIcon i1 = new ImageIcon("background.jpg");
		Image backGround = i1.getImage();
		jPanel = new JPanel() {
			public void paint(Graphics g) {
				g.drawImage(backGround, 0, 0, 500, 500, null);
			}
		};
		
		jPanel.setSize(500,500);
		this.add(jPanel,new Integer(0)); //索引为0,越大越靠近顶层
		
		setLayout(null);
		setFocusable(true);
		setDoubleBuffered(true);
		setVisible(true);
	}
}

界面1类View1

import javax.swing.JButton;

public class View1 extends HomeView{
	private JButton jButton;
	public View1() {
		// TODO Auto-generated constructor stub
		jButton = new JButton("下一页");
		jButton.setSize(100, 30);
		jButton.setLocation(180, 200);
		
		this.add(jButton,new Integer(1));  //索引为1
	}
	public JButton getjButton() {
		return jButton;
	}
	public void setjButton(JButton jButton) {
		this.jButton = jButton;
	}
}

界面2类View2

import javax.swing.JButton;

public class View2 extends HomeView{
	private JButton jButton;
	public View2() {
		// TODO Auto-generated constructor stub
		jButton = new JButton("这里就是第二页");
		jButton.setSize(150, 30);
		jButton.setLocation(180, 200);
		
		this.add(jButton,new Integer(1));
	}
}

运行结果:

java图形界面gui设计 java图形界面常见问题_解决方案_02


java图形界面gui设计 java图形界面常见问题_布局管理器_03