2013-06-06 5 views
1

Примечание: Я искал по сети (этот сайт и другие) и не могу ответить на это сам.(Java) Почему эта вкладка не работает правильно?

Хорошо, ребята. Я новый программист на Java, и мы только что закончили покрытие панелей с вкладками. Это состояние, в котором я включил свое задание: он не работает, и я не могу понять, почему. Я изменил так много дерьма, я больше не могу держать его прямо в голове, но я знаю, что это, наверное, что-то невероятно простое.

Прошу прощения за длину кода, но я пытаюсь дать вам весь код, чтобы вы могли рассказать мне, где я его поднял.

Заранее спасибо. - Кроме того, я знаю, что есть другие предупреждения (т. Е. Неиспользуемый импорт), но я не беспокоюсь об этом. И это не повлияет на мой класс (как я уже сказал, уже представлен), но я хочу знать, что я сделал не так!

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.text.DecimalFormat; 
import java.awt.Color; 

import javax.swing.JOptionPane; 
import javax.swing.JTabbedPane; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JPanel; 
import javax.swing.JComponent; 

public class TabbedPane1 extends JPanel 
{ 
public TabbedPane1() 
{ 
    JTabbedPane tabbedPane = new JTabbedPane(); 
    tabbedPane.addTab("DayGui", new DayGui()); 
    tabbedPane.addTab("OfficeCalc", new OfficeAreaCalculator()); 
    add(tabbedPane); 
} 

public static void main(String[] args) 
{ 
    JFrame myFrame = new JFrame("Tabbed Programs"); 
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    myFrame.add(new TabbedPane1(), BorderLayout.CENTER); 
    myFrame.pack(); 
    myFrame.setVisible(true); 
} 


class DayGui extends JPanel 
{ 
private JPanel mainFrame; 
private JButton cmdGood; 
private JButton cmdBad; 

public DayGui() 
{ 
    mainFrame = new JPanel(); 

    cmdGood = new JButton("Good"); 
    cmdBad = new JButton("Bad"); 

    Container myContainer = mainFrame; 
    myContainer.setLayout(new FlowLayout()); 

    myContainer.add(cmdGood); 
    myContainer.add(cmdBad); 

    cmdGood.setMnemonic('G'); 
    cmdBad.setMnemonic('B'); 

    mainFrame.setSize(300, 100); 

    myContainer.setBackground(Color.blue); 
    cmdGood.setBackground(Color.cyan); 
    cmdBad.setBackground(Color.cyan); 

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

    ButtonsHandler bhandler = new ButtonsHandler(); 
    cmdGood.addActionListener(bhandler); 
    cmdBad.addActionListener(bhandler); 

    //mainFrame.setVisible(true); 
} 

class ButtonsHandler implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource() == cmdGood) 
      JOptionPane.showMessageDialog(null, "Today is a good day!", 
        "Event Handler Message", 
        JOptionPane.INFORMATION_MESSAGE); 

     if(e.getSource() == cmdBad) 
      JOptionPane.showMessageDialog(null, "Today is a bad day!", 
        "Event Handler Message", 
        JOptionPane.INFORMATION_MESSAGE); 
    } 
} 
} 

class OfficeAreaCalculator extends JPanel 
{ 
private JPanel mainFrame; 
private JButton calculateButton; 
private JButton exitButton; 
private JTextField lengthField; 
private JTextField widthField; 
private JTextField areaField; 
private JLabel lengthLabel; 
private JLabel widthLabel; 
private JLabel areaLabel; 

public OfficeAreaCalculator() 
{ 
    mainFrame = new JPanel(); 

    exitButton = new JButton("Exit"); 
    calculateButton = new JButton("Calculate"); 
    lengthField = new JTextField(5); 
    widthField = new JTextField(5); 
    lengthLabel = new JLabel("Enter the length of the office:"); 
    widthLabel = new JLabel("Enter the width of the office:"); 
    areaLabel = new JLabel("Office area:"); 
    areaField = new JTextField(5); 
    areaField.setEditable(false); 

    Container c = mainFrame; 
    c.setLayout(new FlowLayout()); 
    c.setBackground(Color.green); 

    c.add(lengthLabel); 
    c.add(lengthField); 
    c.add(widthLabel); 
    c.add(widthField); 
    c.add(areaLabel); 
    c.add(areaField); 
    c.add(calculateButton); 
    c.add(exitButton); 

    calculateButton.setMnemonic('C'); 
    exitButton.setMnemonic('x'); 

    mainFrame.setSize(260, 150); 

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

    CalculateButtonHandler chandler = new CalculateButtonHandler(); 
    calculateButton.addActionListener(chandler); 

    ExitButtonHandler ehandler = new ExitButtonHandler(); 
    exitButton.addActionListener(ehandler); 

    FocusHandler fhandler = new FocusHandler(); 
    lengthField.addFocusListener(fhandler); 
    widthField.addFocusListener(fhandler); 
    areaField.addFocusListener(fhandler); 

    //mainFrame.setVisible(true); 
} 

class CalculateButtonHandler implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     DecimalFormat num = new DecimalFormat(",###.##"); 
     double width, length, area; 
     String instring; 

     instring = lengthField.getText(); 
     if(instring.equals("")) 
     { 
      instring = ("0"); 
      lengthField.setText("0"); 
     } 
     length = Double.parseDouble(instring); 

     instring = widthField.getText(); 
     if(instring.equals("")) 
     { 
      instring = ("0"); 
      widthField.setText("0"); 
     } 
     width = Double.parseDouble(instring); 

     area = length * width; 
     areaField.setText(num.format(area)); 
    } 
} 

class ExitButtonHandler implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     System.exit(0); 
    } 
} 

class FocusHandler implements FocusListener 
{ 
    public void focusGained(FocusEvent e) 
    { 
     if(e.getSource() == lengthField || e.getSource() == widthField) 
     { 
      areaField.setText(""); 
     } 
     else if(e.getSource() == areaField) 
     { 
      calculateButton.requestFocus(); 
     } 
    } 

    public void focusLost(FocusEvent e) 
    { 
     if(e.getSource() == widthField) 
     { 
      calculateButton.requestFocus(); 
     } 
    } 
} 
} 
} 
+0

Можете ли вы разместить код ошибки, который вы получаете? – fvrghl

ответ

2

Вы добавили JTabbedPane на JPanel.

JTabbedPane tabbedPane = new JTabbedPane(); 
tabbedPane.addTab("DayGui", new DayGui()); 
tabbedPane.addTab("OfficeCalc", new OfficeAreaCalculator()); 
add(tabbedPane); 

С JPanel имеет FlowLayout как по умолчанию, у вас есть эта проблема. Установите макет вашего JPanel на BorderLayout, и проблема будет решена.

setLayout(new BorderLayout()); //Here 
JTabbedPane tabbedPane = new JTabbedPane(); 
tabbedPane.addTab("DayGui", new DayGui()); 
tabbedPane.addTab("OfficeCalc", new OfficeAreaCalculator()); 
add(tabbedPane); 

EDIT:

Кроме того, не расширяя классы с поворотными компонентами, если вы не хотите, чтобы переопределить методы или определить новые. Вместо этого предпочитайте композицию. У меня была такая же плохая привычка. Например, вместо расширения тура TabbedPane1 класс с JPanel, было бы лучше просто создать метод, который возвращает настраиваемый JTabbedPane. Что-то вроде этого:

public JTabbedPane getTabbedPane() { 
     JTabbedPane tabbedPane = new JTabbedPane(); 
     tabbedPane.addTab("DayGui", new DayGui()); 
     tabbedPane.addTab("OfficeCalc", new OfficeAreaCalculator()); 
     return tabbedPane; 
} 

Для вызова:

myFrame.add(new TabbedPane1().getTabbedPane(), BorderLayout.CENTER); 

Таким образом, ваш класс будет "открыт" для наследования.

+0

Ничего себе, спасибо за быстрый ответ, сэр! Вы ученый и джентльмен. – louthelou

+0

Добро пожаловать, и спасибо за комплименты! :) –

Смежные вопросы