0

更新 - これは、昨日投稿した次のリンクに関連しています。

https://stackoverflow.com/questions/15916360/swing-gui-application-in-Java-with-multiple-frames

ここで何か間違ったことをしている場合はお詫びします。以前の投稿に書き込もうとしましたが、コメント ボックスを超えてそれを行う方法が見つかりませんでした。

コードにいくつかの変更を加えました。現在、3 つの JPanels を使用しています。CardLayout に他の 2 つを保持するメインのパネルを除いて、各パネルのクラスを作成しました。メイン パネルは、メイン クラスとアプリケーションで同時に作成されます。ボタンを押したときに 2 つのパネルの 1 つに幸せそうな顔を描こうとしていますが、うまくいきません。

import statements;


public class JDataAnalyzerGui extends JFrame {

private static final String INTRO = "welcome";   
private static final String OPERATIONS = "operations";   
private CardLayout cardlayout = new CardLayout();   
private JPanel mainPanel = new JPanel(cardlayout);   
private WelcomePanel welcomePanel = new WelcomePanel();   
private OperationPanel operationPanel = new OperationPanel();   
private ReadFiles aFileReader;

public JDataAnalyzerGui() {

// adding panels to the main panel

    mainPanel.add(welcomePanel.getMainComponent(), INTRO);     
    mainPanel.add(operationPanel.getMainComponent(), OPERATIONS);

    welcomePanel.addAcceptActionListener(new ActionListener() {    //moves to next view where the buttons are and were the drawing should happen

        @Override     
        public void actionPerformed(ActionEvent e) {                
            int input = Integer.parseInt(welcomePanel.userInput.getText());  
            boolean isValid = isOptionValid(input);         
            if(isValid) {                
                cardlayout.show(mainPanel, OPERATIONS);              
                performActions(aFileReader);             
            }         
        }    
    });      

    operationPanel.addReturnActionListener(new ActionListener() {  //returns to welcome window         
        @Override        
        public void actionPerformed(ActionEvent e) { 
            Graphics pen = getGraphics();
            Object source = e.getSource();           
            if(source == operationPanel.aButton8) {              
                operationPanel.results.setText(null);
                welcomePanel.userInput.setText(null);                
                cardlayout.show(mainPanel, INTRO);           
            }  

// button1 が押されたとき、operationPanel から panel2 に文字列を描画します。

            else if(source == operationPanel.aButton1) {     

                operationPanel.results.setText("The maximun opening value was " + Calculations.hiOpenValue);  
                operationPanel.panel2.setBackground(Color.GREEN); 
                pen.setFont(new Font("Broadway", Font.ITALIC, 12));
                pen.setColor(Color.MAGENTA);
                pen.drawString("this is a test", 20, 40);

            }
            // code for the rest of buttons
        }      
    });   
}


private boolean isOptionValid(int option) {    

    switch(option) {    

    case 1:         
        aFileReader = new ReadFiles("newMSFT.csv");         
        return true;        

    case 4:             
        Object[] options = { "YES", "CANCEL" };         
        int reply = JOptionPane.showOptionDialog(null, "Are you sure you want to go?", "Confirm Exit", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);         
        if(reply == JOptionPane.YES_OPTION)
        System.exit(0);         
        return false;       

    default:        
        JOptionPane.showMessageDialog(null, "That is an invalid option. Please try again");     
        return false;   
    }   
}


public void performActions(ReadFiles obj) {     
    // code for numeric calculations
}   


private JComponent getMainComponent() {      
    return mainPanel;   
}

private static void createAndShowUI() {     

    JFrame frame = new JFrame("Data Analyzer");      
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
    frame.getContentPane().add(new JDataAnalyzerGui().getMainComponent());     
    frame.pack();      
    frame.setLocationRelativeTo(null);      
    frame.setVisible(true);  
}


public static void main(String[] args) {      
    java.awt.EventQueue.invokeLater(new Runnable() {         
        public void run() {            
            createAndShowUI();         
        }      
    });   
}
}

------------------------------ Operation Jpanel import ステートメント;

class OperationPanel {

JPanel mainPanel = new JPanel();  
JPanel panel1 = new JPanel(new FlowLayout());        
JPanel panel2 = new JPanel(new FlowLayout());
JPanel panel3 = new JPanel(new FlowLayout());
JLabel results = new JLabel ("");

JButton aButton1 = new JButton("Max Open");;   // 8 buttons in total, this is the one for painting

JButton aButton8 = new JButton("Return to Main");

public OperationPanel() {      

    mainPanel.setLayout(new GridLayout(3, 1));      
    mainPanel.add(panel1); 
    mainPanel.add(panel3);
    panel2.setBackground(Color.WHITE);      
    mainPanel.add(panel2);      
    panel1.add(aButton1);     
    // adding all buttons to panel1     
    panel2.add(results);                

}

public JComponent getMainComponent() {      
    return mainPanel;   
}

public void addReturnActionListener(ActionListener listener) {   // el que retorna a welcome view      
    aButton8.addActionListener(listener);     
    aButton1.addActionListener(listener);
    //addActionListener for all buttons
}

}

-------------------- ウェルカム パネル クラス WelcomePanel {

private JPanel mainPanel = new JPanel();   
JPanel panel1 = new JPanel();       
JPanel panel2 = new JPanel(new GridLayout(5,1));        
JPanel panel3 = new JPanel(new FlowLayout());
    JLabel greetings = new JLabel("Welcome to Data Analizer"); 
Font bigFont = new Font("Comic Sans", Font.BOLD, 30);
JLabel label1 = new JLabel("Please select one of these options:");  
JLabel label2 = new JLabel("1. newMSFT.csv");
JLabel label3 = new JLabel("2. XXX.csv");
JLabel label4 = new JLabel("3. YYY.csv");
JLabel label5 = new JLabel("4. QUIT");      
Font bigFont2 = new Font("Arial", Font.BOLD, 20);   
JTextField userInput = new JTextField(10);  
JButton aButton = new JButton("Accept");

public WelcomePanel() {

    mainPanel.setLayout(new GridLayout(3, 1));      
    greetings.setFont(bigFont);      
    label1.setFont(bigFont2);
    label2.setFont(bigFont2);
    label3.setFont(bigFont2);
    label4.setFont(bigFont2);
    label5.setFont(bigFont2);      

    mainPanel.add(panel1);     
    mainPanel.add(panel2);     
    mainPanel.add(panel3);
    panel1.add(greetings);
    panel2.add(label1);
    panel2.add(label2);
    panel2.add(label3);
    panel2.add(label4);
    panel2.add(label5);      
    panel3.add(userInput);     
    panel3.add(aButton);

    }

public void addAcceptActionListener(ActionListener listener) {  // este es el que llama a segunda ventana o view      
    aButton.addActionListener(listener);      
    userInput.addActionListener(listener);   
}

public JComponent getMainComponent() {     
    return mainPanel;   
}

}

特定のパネルに描画する方法がわかりません。

ありがとう

4

1 に答える 1

3

あなたは出来る...

ガラス板を使って…

ここに画像の説明を入力

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

public class TestGlassPane04 {

    public static void main(String[] args) {
        new TestGlassPane04();
    }

    public TestGlassPane04() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }
                
                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridLayout(2, 2, 10, 10));
                frame.add(createBox(1));
                frame.add(createBox(2));
                frame.add(createBox(3));
                frame.add(createBox(4));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setGlassPane(new GlassPane());
                frame.getGlassPane().setVisible(true);
                frame.setVisible(true);
            }
        });
    }
    
    protected JLabel createBox(int box) {
        JLabel label = new JLabel("Box " + box);
        label.setBorder(new CompoundBorder(new LineBorder(Color.GRAY), new EmptyBorder(10, 10, 10, 10)));
        return label;
    }
    
    public class GlassPane extends JPanel {
        
        private BufferedImage background;
        
        public GlassPane() {
            setOpaque(false);
            try {
                background = ImageIO.read(getClass().getResource("/sillydash.png"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            if (background != null) {
                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;
                g2d.drawImage(background, x, y, this);
            }
            g2d.dispose();
        }
    }
    
}

詳細については、ルートペインの使用方法をご覧ください...

それとも...

JXLayer/ JLayerを使用して、よりローカライズされたバージョンのガラス ペインを作成します...

于 2013-04-12T01:31:53.913 に答える