首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

swing 界面格局求教

2012-09-27 
swing 界面布局求教我有张图片我想在图片上放几个按钮 让按钮与图片形成一个整体我现在把图片放到jlabel中

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,直接拖啊。

探讨
我有张图片 我想在图片上放几个按钮 让按钮与图片形成一个整体
我现在把图片放到jlabel中 然后却无法将按钮移动到图片控件上
请教如何才能让按钮置于jlbel上方 或者别的方法也行 求教!

热点排行