swing 界面布局求教
我有张图片 我想在图片上放几个按钮 让按钮与图片形成一个整体
我现在把图片放到jlabel中 然后却无法将按钮移动到图片控件上
请教如何才能让按钮置于jlbel上方 或者别的方法也行 求教!
[解决办法]
考虑把图片做成JPanel的背景吧。
[解决办法]
setBackgroundPainter是swingx里JXPanel提供的方法。
[解决办法]
- Java code
//按钮背景设置JButton jbG1;//静态方式设置背景图片jbG1 = new JButton(new ImageIcon("imgs//BtList_.png"));//动态方式更改背景图片jbG1.setIcon(new ImageIcon(("imgs//BtList.png")));
[解决办法]
- Java code
package com.han;import java.awt.BorderLayout;import java.awt.Container;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Image;import java.awt.Insets;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.ComponentAdapter;import java.awt.event.ComponentEvent;import java.awt.image.BufferedImage;import java.beans.PropertyVetoException;import java.io.IOException;import java.net.URL;import javax.imageio.ImageIO;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JDesktopPane;import javax.swing.JFrame;import javax.swing.JInternalFrame;import javax.swing.JLabel;import javax.swing.JPanel;/** * 有几个技术改进:<p> * 1. 在desktopPane的背景图片上再加上button等组件<p> * 2. desktopPane的背景图片大小随着整个窗体的大小变化而变化,使图片始终能够铺满整个区域<p> * 3. 对于desktopPane上的所有组件不使用绝对布局而是在backLabel存在的情况下还使用布局管理器 * @author HAN * */@SuppressWarnings("serial")public class JInternalFrame_1 extends JFrame { JInternalFrame internalFramePersonel = null; JInternalFrame internalFrameCount = null; JInternalFrame internalFramePayment = null; JPanel panelInternal; static JDesktopPane desktopPane = null; static JPanel panel; static Container container; static Dimension dimensionCurrent; static Insets insets; // the frame border int desktopPaneWidth; int desktopPaneHeight; static JLabel backLabel; URL resource; // the backLabel image URL resource public JInternalFrame_1() { // TODO Auto-generated constructor stub panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); JButton buttonPersonel = new JButton("人事管理"); JButton buttonCount = new JButton("帐套管理"); JButton buttonPayment = new JButton("待遇管理"); panel.add(buttonPersonel); panel.add(buttonCount); panel.add(buttonPayment); container = getContentPane(); container.add(panel, BorderLayout.NORTH); desktopPane = new JDesktopPane(); container.add(desktopPane, BorderLayout.CENTER); resource = this.getClass().getResource("/images/LightHouse.jpg"); ImageIcon imageIcon = new ImageIcon(resource); backLabel = new JLabel(imageIcon); backLabel.setBounds(0, 0, imageIcon.getIconWidth(), imageIcon.getIconHeight()); // "new Integer(Integer.MIN_VALUE)" ensures that its layer is always // under the others. desktopPane.add(backLabel, new Integer(Integer.MIN_VALUE)); desktopPane.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); panelInternal = new JPanel(); // Creates a new JPanel with a double buffer and a flow layout. panelInternal.setBounds(0, 0, 300, 300); System.out.println(panelInternal.isOpaque()); panelInternal.setOpaque(false); System.out.println(desktopPane.getWidth() + "\t" + desktopPane.getHeight()); JButton buttonInternal = new JButton("buttonInternal"); JButton testButton = new JButton("testButton"); testButton.setBounds(200, 0, 100, 40); buttonInternal.setBounds(0, 0, 100, 40); // 设置有布局管理器后,setBounds()就失效了。换句话说,setBounds()只有在没有布局管理器的情况下才有效。 panelInternal.add(testButton); panelInternal.add(buttonInternal); desktopPane.add(panelInternal, new Integer(1)); // the reason for non-using the inner hidden class is that the variable // that it will use is must be "final", // and this causes it can not be assigned in the inner hidden class. // So we use the inner class instead, which is parallel to the level // "method". buttonPersonel.addActionListener(new ButtonPersonelActionListener()); buttonCount.addActionListener(new ButtonCountActionListener()); buttonPayment.addActionListener(new ButtonPaymentActionListener()); // System.out.println(panel.getWidth() + "\t" + panel.getHeight()); System.out.println(panel.getPreferredSize()); System.out.println(desktopPane.getPreferredSize()); addComponentListener(new MyComponentListener()); }
[解决办法]
由于回复有长度限制,接下的代码是叙着上面的代码块:
- Java code
private class MyComponentListener extends ComponentAdapter { @Override public void componentResized(ComponentEvent e) { // TODO Auto-generated method stub dimensionCurrent = getSize(); System.out.println("componentResized: " + dimensionCurrent); desktopPaneWidth = dimensionCurrent.width - insets.left - insets.right; desktopPaneHeight = dimensionCurrent.height - panel.getPreferredSize().height - insets.top - insets.bottom; System.out.println("desktopPaneWidth: " + desktopPaneWidth + "\tdesktopPaneHeight: " + desktopPaneHeight); /* use the getScaledInstance() to scale the image */ Image image = Toolkit.getDefaultToolkit().getImage(resource); // is more efficient than ImageIO.read() ImageIcon imageIcon = new ImageIcon(image.getScaledInstance( desktopPaneWidth, desktopPaneHeight, Image.SCALE_FAST)); backLabel.setIcon(imageIcon); backLabel.setBounds(0, 0, imageIcon.getIconWidth(), [size=10px][/size] imageIcon.getIconHeight()); // /* use the AffineTransform to scale the image (it turns out that // * this method is less efficient than getScaledInstance()) */// BufferedImage bufferedImage;// try {// bufferedImage = ImageIO.read(resource);// BufferedImage bufferedImageScaled = ImageScale.scale(// bufferedImage, desktopPaneWidth, desktopPaneHeight, 1);// ImageIcon imageIcon = new ImageIcon(bufferedImageScaled);// backLabel.setIcon(imageIcon);// backLabel.setBounds(0, 0, imageIcon.getIconWidth(),// imageIcon.getIconHeight());// } catch (IOException e1) {// // TODO Auto-generated catch block// e1.printStackTrace();// } panelInternal.setBounds(0, 0, desktopPaneWidth, desktopPaneHeight); } } private class ButtonPersonelActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if (internalFramePersonel == null || internalFramePersonel.isClosed()) { JInternalFrame[] allFrames = desktopPane.getAllFrames(); int titleBarHight = 30 * allFrames.length; int x = titleBarHight + 10; int y = x; int width = 250; int height = 180; internalFramePersonel = new JInternalFrame("人事管理", true, true, true, true); internalFramePersonel.setVisible(true); internalFramePersonel.setBounds(x, y, width, height); desktopPane.add(internalFramePersonel); } try { // indispensable for the visualization of the internal frame internalFramePersonel.setSelected(true); } catch (PropertyVetoException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } private class ButtonCountActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if (internalFrameCount == null || internalFrameCount.isClosed()) { JInternalFrame[] allFrames = desktopPane.getAllFrames(); int titleBarHight = 30 * allFrames.length; int x = titleBarHight + 10; int y = x; int width = 250; int height = 180; internalFrameCount = new JInternalFrame("帐套管理", true, true, true, true); internalFrameCount.setVisible(true); internalFrameCount.setBounds(x, y, width, height); URL resource = this.getClass().getResource("/images/Luxun.jpg"); BufferedImage imageScaled = null; BufferedImage in; try { in = ImageIO.read(resource); imageScaled = ImageScale.scale(in, 0.05, 0.05, 1); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } ImageIcon imageIcon = new ImageIcon(imageScaled); internalFrameCount.setFrameIcon(imageIcon); desktopPane.add(internalFrameCount); } try { // indispensable for the visualization of the internal frame internalFrameCount.setSelected(true); } catch (PropertyVetoException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } private class ButtonPaymentActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if (internalFramePayment == null || internalFramePayment.isClosed()) { JInternalFrame[] allFrames = desktopPane.getAllFrames(); int titleBarHight = 30 * allFrames.length; int x = titleBarHight + 10; int y = x; int width = 250; int height = 180; internalFramePayment = new JInternalFrame("待遇管理", true, true, true, true); internalFramePayment.setVisible(true); internalFramePayment.setBounds(x, y, width, height); URL resource = this.getClass().getResource("/images/Luxun.jpg"); BufferedImage imageScaled = null; BufferedImage in; try { in = ImageIO.read(resource); imageScaled = ImageScale.scale(in, 0.05, 0.05, 1); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } ImageIcon imageIcon = new ImageIcon(imageScaled); internalFramePayment.setFrameIcon(imageIcon); desktopPane.add(internalFramePayment); } try { // indispensable for the visualization of the internal frame internalFramePayment.setSelected(true); } catch (PropertyVetoException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub JInternalFrame_1 frame = new JInternalFrame_1(); frame.setTitle("企业人事管理系统 "); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(100, 100, 570, 470); /* obtain the frame border */ insets = frame.getInsets(); System.out.println(insets); System.out.println(desktopPane.getSize()); System.out.println(container.getSize()); System.out.println(frame.getSize()); System.out.println(panel.getSize()); }}
[解决办法]
如果你用Eclipse,安装一个windowbuilder吧。
如果你用netbeans,直接拖啊。