由于setBounds()方法中给定的x坐标,JPanel尚未更改

时间:2015-09-03 12:15:01

标签: java swing null-layout-manager

虽然众所周知,将setBounds()方法与setLayout(null)一起使用并不是一个好习惯,但我必须这样做才能进行自定义设计。问题是,我的面板可以因其y坐标而改变,但不能设置为给定的x坐标。在我给定的代码中,无论x坐标是什么,面板都保持不变!

怎么解决?欢迎任何帮助或建议!真的是一个奇怪的问题!

截图: enter image description here

在代码中修改

public class PanelMeter extends JPanel{
    JLabel meterImage;
    javax.swing.Timer timer;
    int x;

    public PanelMeter()
    {
        this.setBounds(400,100,300, 210);
        this.setBackground(Color.lightGray);
        this.setLayout(null);
        this.setBorder(BorderFactory.createLineBorder(Color.white, 3));

        addImage();
    }

    public void addImage()
    {
        try {
            BufferedImage image= ImageIO.read(new File("E:\\java\\Accelromete final\\meter.png"));
            ImageIcon icon= new ImageIcon(image);           
            meterImage= new JLabel(icon);
            meterImage.setBounds(10, 1, 300, 390);
            this.add(meterImage);       
        } catch (IOException e) {           
            System.out.println("Error in loading image!");
        }   
    }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.fillOval(140, 160, 15, 15);
        g.drawLine(144, 165, 147, 80);
        g.drawLine(151, 165, 147, 80);
        g.drawString("Left", 50, 70);
        g.drawString("Right",230, 70);
    }
}

主要课程

public class Main {
    public static void main(String[] args) {        
        MainFrame frame= new MainFrame();
        PanelValue panelValue= new PanelValue();
        PanelMeter panelMeter= new PanelMeter();
        Panel3D panel3d= new Panel3D();
        frame.add(panel3d);
        frame.add(panelMeter);
        frame.add(panelValue);
        frame.setVisible(true);
    }
}

JFrame类

public class MainFrame extends JFrame implements ActionListener {   
    JLabel ipLabel, portLabel;
    JTextField ipField, portField;
    JButton connectButton;

    public MainFrame()
    {
        this.setSize(800,650);
        this.setLayout(null);
        this.setResizable(false);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);  
        //addComponents();
    }
}

1 个答案:

答案 0 :(得分:0)

如果您的PanelMeter组件用于某些父级(如JFrame),则您已将两个组件设置为setLayout(null)。然后必须接受设置PanelMeter的界限。