Java 在图像顶部放置按钮?

Java 在图像顶部放置按钮?,java,swing,Java,Swing,所以我正在努力让它工作。正在尝试制作一个小型调优应用程序。我想把按钮放在背景图像(图像是吉他主轴箱)的适当调谐钉的顶部。但是,我不知道如何使用流布局来管理它。我可能很愚蠢,但有人能告诉我这里发生了什么吗 package guitartuner; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.text.*; import java.awt.image.*; import java.io.*

所以我正在努力让它工作。正在尝试制作一个小型调优应用程序。我想把按钮放在背景图像(图像是吉他主轴箱)的适当调谐钉的顶部。但是,我不知道如何使用流布局来管理它。我可能很愚蠢,但有人能告诉我这里发生了什么吗

package guitartuner;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.text.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;


public class GuitarTuner extends JFrame{

private JFrame mainFrame;
private JLabel EJLabel, AJLabel, DJLabel, GJLabel, BJLabel, eJLabel, guitarJLabel,
        bassJLabel, loopJLabel;
private JPanel controlPanel;
private JButton EButton, AButton, DButton, GButton, BButton, eButton;

public class LoadImageApp extends Component{
    BufferedImage img;

    public void paint(Graphics g){
        g.drawImage(img, 0, 0, null);
    }

    public LoadImageApp(){
        try{
            img = ImageIO.read(new File("/Users/Yojimbo/NetBeansProjects/guitarTuner/src/guitartuner/headstock.jpg"));
        } catch (IOException e){    
        }
    }
    public Dimension getPreferredSize() {
        if (img == null) {
            return new Dimension(500,500);
        } else {
            return new Dimension(img.getWidth(null), img.getHeight(null));
        }
    }
}

public GuitarTuner(){
    createUserInterface();
}

public void createUserInterface(){



    JFrame f = new JFrame("Guitar Tuner");

    f.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e){
            System.exit(0);
        }
    });

    f.add(new LoadImageApp());
    f.setLayout(new FlowLayout());

    EButton = new JButton();
    EButton.setBounds(0, 0, 50, 10);
    EButton.setText("E");
    f.add(EButton);

    AButton = new JButton();
    AButton.setBounds(40, 40, 50, 10);
    AButton.setText("A");
    f.add(AButton);

    DButton = new JButton();
    DButton.setBounds(60, 60, 50, 10);
    DButton.setText("D");
    f.add(DButton);

    GButton = new JButton();
    GButton.setBounds(20, 100, 50, 10);
    GButton.setText("G");
    f.add(GButton);

    BButton = new JButton();
    BButton.setBounds(40, 100, 50, 10);
    BButton.setText("B");
    f.add(BButton);

    eButton = new JButton();
    eButton.setBounds(60, 100, 50, 10);
    eButton.setText("e");
    f.add(eButton);

    f.pack();
    f.setTitle("Aaron's Awesome Guitar Tuner");
    f.setSize (400, 575);
    f.setVisible(true);
}

public static void main(String[] args) {
    GuitarTuner application = new GuitarTuner();
    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}   
}

尝试使用GridBagLayout。花点时间读一下。这可能会帮助你,尤其是如果你想把按钮放在你想要的位置上


尝试使用GridBagLayout。花点时间读一下。这可能会帮助你,尤其是如果你想把按钮放在你想要的位置上


您也可以在createUserInterface()方法的开头添加这些行

编辑:如果这样做,还必须删除LoadImageApp实例的f.add(…)

public void createUserInterface() throws IOException {
    BufferedImage img = ImageIO.read(new File("/Users/Yojimbo/NetBeansProjects/guitarTuner/src/guitartuner/headstock.jpg"));
    JFrame f = new JFrame("Guitar Tuner");
    JPanel contentPane = new JPanel(){
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
        }
    };
    f.setContentPane(contentPane);
...

您还可以在createUserInterface()方法的开头添加这些行

编辑:如果这样做,还必须删除LoadImageApp实例的f.add(…)

public void createUserInterface() throws IOException {
    BufferedImage img = ImageIO.read(new File("/Users/Yojimbo/NetBeansProjects/guitarTuner/src/guitartuner/headstock.jpg"));
    JFrame f = new JFrame("Guitar Tuner");
    JPanel contentPane = new JPanel(){
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
        }
    };
    f.setContentPane(contentPane);
...

如果希望组件彼此重叠,可以使用JLayeredPane

见:


您可以将LoadImageApp放在一个层中,将另一个JPanel放在上面的一个层中,其中FlowLayout包含按钮。

如果您希望组件彼此重叠,可以使用JLayeredPane

见:

您可以将LoadImageApp放在一个层中,将另一个JPanel放在上面的一个层中,其中FlowLayout包含按钮

  • 不要从组件扩展
    LoadImageApp
    ,而是从
    JPanel
  • 覆盖
    paintComponent
    方法而不是
    paint
  • 将新图像面板的布局从其构造函数设置为
    FlowLayout
  • 不要设置框架布局,只需添加图像面板即可。并将所有按钮直接添加到图像面板
  • 以下是工作代码:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.text.*;
    import java.awt.image.*;
    import java.io.*;
    import javax.imageio.*;
    
    public class GuitarTuner extends JFrame {
    
        private JFrame mainFrame;
        private JLabel EJLabel, AJLabel, DJLabel, GJLabel, BJLabel, eJLabel, guitarJLabel, bassJLabel, loopJLabel;
        private JPanel controlPanel;
        private JButton EButton, AButton, DButton, GButton, BButton, eButton;
    
        public class LoadImageApp extends JPanel {
            BufferedImage img;
    
            public void paintComponent(Graphics g) {
                g.drawImage(img, 0, 0, null);
            }
    
            public LoadImageApp() {
                super(new FlowLayout());
                try {
                    img = ImageIO
                            .read(new File("/Users/Yojimbo/NetBeansProjects/guitarTuner/src/guitartuner/headstock.jpg"));
                } catch (IOException e) {
                }
            }
    
            public Dimension getPreferredSize() {
                if (img == null) {
                    return new Dimension(500, 500);
                } else {
                    return new Dimension(img.getWidth(null), img.getHeight(null));
                }
            }
        }
    
        public GuitarTuner() {
            createUserInterface();
        }
    
        public void createUserInterface() {
    
            JFrame f = new JFrame("Guitar Tuner");
    
            f.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
    
            LoadImageApp panel = new LoadImageApp();
            f.add(panel);
    
            EButton = new JButton();
            EButton.setBounds(0, 0, 50, 10);
            EButton.setText("E");
            panel.add(EButton);
    
            AButton = new JButton();
            AButton.setBounds(40, 40, 50, 10);
            AButton.setText("A");
            panel.add(AButton);
    
            DButton = new JButton();
            DButton.setBounds(60, 60, 50, 10);
            DButton.setText("D");
            panel.add(DButton);
    
            GButton = new JButton();
            GButton.setBounds(20, 100, 50, 10);
            GButton.setText("G");
            panel.add(GButton);
    
            BButton = new JButton();
            BButton.setBounds(40, 100, 50, 10);
            BButton.setText("B");
            panel.add(BButton);
    
            eButton = new JButton();
            eButton.setBounds(60, 100, 50, 10);
            eButton.setText("e");
            panel.add(eButton);
    
            f.pack();
            f.setTitle("Aaron's Awesome Guitar Tuner");
            f.setSize(400, 575);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            GuitarTuner application = new GuitarTuner();
            application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    
  • 不要从组件扩展
    LoadImageApp
    ,而是从
    JPanel
  • 覆盖
    paintComponent
    方法而不是
    paint
  • 将新图像面板的布局从其构造函数设置为
    FlowLayout
  • 不要设置框架布局,只需添加图像面板即可。并将所有按钮直接添加到图像面板
  • 以下是工作代码:

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.text.*;
    import java.awt.image.*;
    import java.io.*;
    import javax.imageio.*;
    
    public class GuitarTuner extends JFrame {
    
        private JFrame mainFrame;
        private JLabel EJLabel, AJLabel, DJLabel, GJLabel, BJLabel, eJLabel, guitarJLabel, bassJLabel, loopJLabel;
        private JPanel controlPanel;
        private JButton EButton, AButton, DButton, GButton, BButton, eButton;
    
        public class LoadImageApp extends JPanel {
            BufferedImage img;
    
            public void paintComponent(Graphics g) {
                g.drawImage(img, 0, 0, null);
            }
    
            public LoadImageApp() {
                super(new FlowLayout());
                try {
                    img = ImageIO
                            .read(new File("/Users/Yojimbo/NetBeansProjects/guitarTuner/src/guitartuner/headstock.jpg"));
                } catch (IOException e) {
                }
            }
    
            public Dimension getPreferredSize() {
                if (img == null) {
                    return new Dimension(500, 500);
                } else {
                    return new Dimension(img.getWidth(null), img.getHeight(null));
                }
            }
        }
    
        public GuitarTuner() {
            createUserInterface();
        }
    
        public void createUserInterface() {
    
            JFrame f = new JFrame("Guitar Tuner");
    
            f.addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
    
            LoadImageApp panel = new LoadImageApp();
            f.add(panel);
    
            EButton = new JButton();
            EButton.setBounds(0, 0, 50, 10);
            EButton.setText("E");
            panel.add(EButton);
    
            AButton = new JButton();
            AButton.setBounds(40, 40, 50, 10);
            AButton.setText("A");
            panel.add(AButton);
    
            DButton = new JButton();
            DButton.setBounds(60, 60, 50, 10);
            DButton.setText("D");
            panel.add(DButton);
    
            GButton = new JButton();
            GButton.setBounds(20, 100, 50, 10);
            GButton.setText("G");
            panel.add(GButton);
    
            BButton = new JButton();
            BButton.setBounds(40, 100, 50, 10);
            BButton.setText("B");
            panel.add(BButton);
    
            eButton = new JButton();
            eButton.setBounds(60, 100, 50, 10);
            eButton.setText("e");
            panel.add(eButton);
    
            f.pack();
            f.setTitle("Aaron's Awesome Guitar Tuner");
            f.setSize(400, 575);
            f.setVisible(true);
        }
    
        public static void main(String[] args) {
            GuitarTuner application = new GuitarTuner();
            application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }
    

    所以我不是来告诉你你的密码的我不是说真的。。。我的意思是,为什么我的按钮拒绝放在我的图像上呢。但是如果你想变得粗鲁,浪费你和我的时间,那就继续吧…所以我不是来告诉你你的代码的。我不是说真的。。。我的意思是,为什么我的按钮拒绝放在我的图像上呢。但是如果你想变得粗鲁,浪费你和我的时间,那就去吧。。。