在将大量文本输入JTextArea

时间:2016-01-17 00:59:57

标签: java swing jtextarea shrink

我在JTabbedPane框中有一个JDialog,在该窗格中包含的所有GridBagLayout上使用JPanels。在显示的第一个面板上有一个JTextAreadescTxt),可以输入电影描述。当您在JTextArea中输入大量文本时,它似乎很好单击面板上任何不是组件(空灰色空间)的任何位置,然后所有文本字段和文本窗格缩小到大小为0的位置。

以下是要粘贴和测试的示例文本:

  

在对火星的载人飞行任务中,宇航员马克沃特尼被假定为   在一场猛烈的风暴之后死去,并被他的船员留下。但沃特尼有   幸存下来,发现自己被困在敌对的星球上。   只有微薄的供应,他必须利用他的聪明才智,机智和   精神生存并找到一种方式向地球发出信号表明他还活着。

这是我的代码的可运行示例:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 *
 * @author Chris
 */
public class AdminWindow extends JDialog implements ActionListener {

    private JPanel adminPanel1, adminPanel2, adminPanel3;
    private JTabbedPane tabPane;
    private GridBagConstraints g1, g2, g3;
    private JLabel idLbl, showLbl, descLbl, ageLbl, imgLbl, timeLbl, screenLbl,
            stanLbl, vipLbl, idLbl1, showLbl1, descLbl1, ageLbl1, imgLbl1, imgName;
    private JTextField idTxt, showTxt, imgTxt, timeTxt, stanTxt, vipTxt,
            idTxt1, showTxt1, imgTxt1;
    private JTextArea descTxt, descTxt1;
    private JComboBox ageCb, ageCb1, screenCb, timeCb, showingCb;
    private JScrollPane descTxtPane, descTxtPane1;
    private ArrayList<String> screenList, timeList, showingList;
    private DefaultComboBoxModel screenModel, timeModel, showingModel;
    private JButton submit, clear, seatSubmit, seatClear, addBtn, subBtn,
            submit1, clear1, imgBtn;
    private double stanPrice, vipPrice;
    private String stanPriceString, vipPriceString, priceExpression, imgString;
    private Pattern p;
    private File dest, chosenFile;

    public AdminWindow() {

        //frame properties
        super(new JFrame("Admin Panel"));
        setTitle("Admin Panel");
        //setSize(Dimensions.getScreenWidth() - 100, Dimensions.getScreenHeight() - 100);
        setAlwaysOnTop(true);
        setResizable(false);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);

        //regular expression validations
        priceExpression = "[0-9]{1,2}[.]{1}[0-9]{2}";
        p = Pattern.compile(priceExpression);

        //panel dec
        tabPane = new JTabbedPane();
        adminPanel1 = new JPanel();
        adminPanel2 = new JPanel();
        adminPanel3 = new JPanel();
        g1 = new GridBagConstraints();
        g2 = new GridBagConstraints();
        g3 = new GridBagConstraints();

        //label dec
        idLbl = new JLabel("Film ID");
        showLbl = new JLabel("Film Name");
        descLbl = new JLabel("Film Description");
        ageLbl = new JLabel("Age Rating");
        imgLbl = new JLabel("Image");
        idLbl1 = new JLabel("Film ID");
        showLbl1 = new JLabel("Film Name");
        descLbl1 = new JLabel("Film Description");
        ageLbl1 = new JLabel("Age Rating");
        imgLbl1 = new JLabel("Image");
        timeLbl = new JLabel("Showing Times");
        screenLbl = new JLabel("Screen Number");
        stanLbl = new JLabel("Standard Ticket Cost (£)");
        vipLbl = new JLabel("VIP Ticket Cost (£)");
        imgName = new JLabel("filename.jpg");

        //label properties
        imgName.setPreferredSize(new Dimension(100, 20));

        //txttfield dec
        idTxt = new JTextField(4);
        showTxt = new JTextField(30);
        descTxt = new JTextArea(4, 30);
        descTxtPane = new JScrollPane(descTxt, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        imgTxt = new JTextField();
        idTxt1 = new JTextField(4);
        showTxt1 = new JTextField(30);
        descTxt1 = new JTextArea(4, 30);
        descTxtPane1 = new JScrollPane(descTxt1, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        imgTxt1 = new JTextField();
        timeTxt = new JTextField(4);
        stanTxt = new JTextField(4);
        vipTxt = new JTextField(4);

        //textfield properties
        idTxt1.setEditable(false);
        descTxt.setWrapStyleWord(true);
        descTxt.setLineWrap(true);

        //drop-down dec
        ageCb = new JComboBox();
        ageCb1 = new JComboBox();
        screenCb = new JComboBox();
        timeCb = new JComboBox();
        showingCb = new JComboBox();

        //dropdown properties
        timeCb.setPreferredSize(new Dimension(60, 23));

        //buttons
        submit = new JButton("Submit");
        clear = new JButton("Clear");
        submit1 = new JButton("Submit");
        clear1 = new JButton("Clear");
        seatSubmit = new JButton("Submit");
        seatClear = new JButton("Show Current");
        addBtn = new JButton("+");
        subBtn = new JButton("-");
        imgBtn = new JButton("Browse..");

        //button properties
        addBtn.setFocusPainted(false);
        subBtn.setFocusPainted(false);
        addBtn.setMargin(new Insets(0, 5, 0, 5));
        subBtn.setMargin(new Insets(0, 5, 0, 5));

        //listeners
        submit.addActionListener(this);
        clear.addActionListener(this);
        seatSubmit.addActionListener(this);
        seatClear.addActionListener(this);
        addBtn.addActionListener(this);
        subBtn.addActionListener(this);
        imgBtn.addActionListener(this);


        //fill price text fields with existing prices
        defaultForm();

        //add items to jcombobox
        ageCb.addItem("U");
        ageCb.addItem("12A");
        ageCb.addItem("15");
        ageCb.addItem("18");
        ageCb1.addItem("U");
        ageCb1.addItem("12A");
        ageCb1.addItem("15");
        ageCb1.addItem("18");

        //panel properties

        adminPanel1.setLayout(new GridBagLayout());
        adminPanel2.setLayout(new GridBagLayout());
        adminPanel3.setLayout(new GridBagLayout());
        adminPanel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "New Showing"));
        adminPanel2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Seat Prices"));
        adminPanel3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Edit Showing"));

        //ading panels to tabbed pane
        tabPane.addTab("Add Showings", null, adminPanel1, "Add new showings & showing times");
        tabPane.addTab("Seat Prices", null, adminPanel2, "Change seat prices");
        tabPane.addTab("Edit Showing", null, adminPanel3, "Edit existing showing");

        //-----adding components to pane--------------------------------------!
        g1.gridx = 0;
        g1.gridy = 0;
        g1.insets = new Insets(10, 0, 0, 10);
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(idLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        adminPanel1.add(idTxt, g1);
        g1.gridy++;
        g1.gridx--;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(showLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        g1.gridwidth = 4;
        adminPanel1.add(showTxt, g1);
        g1.gridwidth = 1;
        g1.gridy++;
        g1.gridx--;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(descLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        g1.gridwidth = 4;
        adminPanel1.add(descTxtPane, g1);
        g1.gridwidth = 1;
        g1.gridy++;
        g1.gridx--;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(ageLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        adminPanel1.add(ageCb, g1);
        g1.gridy++;
        g1.gridx--;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(imgLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        g1.gridwidth = 2;
        adminPanel1.add(imgBtn, g1);
        g1.gridx = 3;
        adminPanel1.add(imgName, g1);
        g1.gridwidth = 1;
        g1.gridy++;
        g1.gridx = 0;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(screenLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        adminPanel1.add(screenCb, g1);
        g1.gridx--;
        g1.gridy++;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(timeLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        adminPanel1.add(timeTxt, g1);
        g1.gridx++;
        adminPanel1.add(addBtn, g1);
        g1.gridx++;
        adminPanel1.add(timeCb, g1);
        g1.gridx++;
        adminPanel1.add(subBtn, g1);
        //buttons
        g1.gridy++;
        g1.gridx = 0;
        g1.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(clear, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        g1.gridwidth = 4;
        adminPanel1.add(submit, g1);
        g1.gridwidth = 1;

        //------adding components to panel2-----------------------------------!
        //left
        g2.gridx = 0;
        g2.gridy = 0;
        g2.insets = new Insets(10, 10, 0, 10);
        g2.anchor = GridBagConstraints.LINE_END;
        adminPanel2.add(stanLbl, g2);
        g2.gridy++;
        adminPanel2.add(vipLbl, g2);
        g2.gridy++;
        adminPanel2.add(seatClear, g2);
        //right
        g2.gridy = 0;
        g2.gridx++;
        g2.anchor = GridBagConstraints.LINE_START;
        adminPanel2.add(stanTxt, g2);
        g2.gridy++;
        adminPanel2.add(vipTxt, g2);
        g2.gridy++;
        adminPanel2.add(seatSubmit, g2);

        //-----adminpanel3-----------------------------------------------------
        //adding components to panel1
        g3.gridx = 1;
        g3.gridy = 0;
        g3.insets = new Insets(10, 0, 0, 10);
        g3.anchor = GridBagConstraints.LINE_START;
        g3.gridwidth = 4;
        adminPanel3.add(showingCb, g3);
        g3.gridwidth = 1;
        g3.gridx--;
        g3.gridy++;
        g3.anchor = GridBagConstraints.LINE_END;
        adminPanel3.add(idLbl1, g3);
        g3.gridx++;
        g3.anchor = GridBagConstraints.LINE_START;
        adminPanel3.add(idTxt1, g3);
        g3.gridy++;
        g3.gridx--;
        g3.anchor = GridBagConstraints.LINE_END;
        adminPanel3.add(showLbl1, g3);
        g3.gridx++;
        g3.anchor = GridBagConstraints.LINE_START;
        g3.gridwidth = 5;
        adminPanel3.add(showTxt1, g3);
        g3.gridwidth = 1;
        g3.gridy++;
        g3.gridx--;
        g3.anchor = GridBagConstraints.LINE_END;
        adminPanel3.add(descLbl1, g3);
        g3.gridx++;
        g3.anchor = GridBagConstraints.LINE_START;
        g3.gridwidth = 4;
        adminPanel3.add(descTxtPane1, g3);
        g3.gridwidth = 1;
        g3.gridy++;
        g3.gridx--;
        g3.anchor = GridBagConstraints.LINE_END;
        adminPanel3.add(ageLbl1, g3);
        g3.gridx++;
        g3.anchor = GridBagConstraints.LINE_START;
        adminPanel3.add(ageCb1, g3);
        g3.gridy++;
        g3.gridx--;

        //buttons
        g3.gridy++;
        g3.gridx = 0;
        g3.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
        g3.anchor = GridBagConstraints.LINE_END;
        adminPanel3.add(clear1, g3);
        g3.gridx++;
        g3.anchor = GridBagConstraints.LINE_START;
        g3.gridwidth = 4;
        adminPanel3.add(submit1, g3);
        g3.gridwidth = 1;

        //adding tabbed pane to frame
        this.add(tabPane);
        this.pack();

        //visibility
        setVisible(true);
        tabPane.setVisible(true);

        //actionlisteners
    }

    public static void main(String[] args) {
        AdminWindow test = new AdminWindow();
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == imgBtn) {

            //--JFileChooser, ugly but better to use--
            String userDir = System.getProperty("user.home");
            JFileChooser chooser = new JFileChooser(userDir+"/Desktop");
            int choice = chooser.showDialog(this, "Choose");
            if (choice != JFileChooser.APPROVE_OPTION) {
                return;
            }

            FileNameExtensionFilter filter = new FileNameExtensionFilter("Image Files", "jpg", "png", "gif", "jpeg");
            chooser.setAcceptAllFileFilterUsed(false);
            chooser.addChoosableFileFilter(filter);
            chosenFile = chooser.getSelectedFile();
            imgName.setText(chosenFile.getName());
            dest = new File(System.getProperty("user.dir") + "/src/iegroup/resources", chosenFile.getName());
            imgString = "resources/" + chosenFile.getName();
            System.out.println(dest.toPath());
        }

        if (e.getSource() == submit) {


        if (e.getSource() == clear ){


        }

        if (e.getSource() == seatSubmit) {

            }
        }
        if (e.getSource() == seatClear) {
            defaultForm();
        }

        if (e.getSource() == addBtn) {

            timeModel.addElement(timeTxt.getText());
            timeList.add(timeTxt.getText());
        }
        if (e.getSource() == subBtn) {
            timeModel.removeElement(timeCb.getSelectedItem());
            timeList.remove(timeCb.getSelectedItem());
        }
    }

    private void defaultForm() {

        stanPriceString = String.format("%.2f", stanPrice);
        vipPriceString = String.format("%.2f", vipPrice);
        stanTxt.setText(stanPriceString);
        vipTxt.setText(vipPriceString);
    }

    public void showValidationPrompt(String message) {
        JFrame validFrame = new JFrame();
        validFrame.setAlwaysOnTop(true);
        JOptionPane.showMessageDialog(validFrame, message, "Invalid input", JOptionPane.CLOSED_OPTION);

    }

    public void showSuccessPrompt(String message) {
        JFrame errorFrame = new JFrame();
        errorFrame.setAlwaysOnTop(true);
        JOptionPane.showMessageDialog(errorFrame, message, "Success", JOptionPane.CLOSED_OPTION);

    }
}

请帮忙。这个非常令人困惑,我似乎无法在任何地方找到解决方案。

1 个答案:

答案 0 :(得分:1)

所以,问题似乎是setResizable(false)ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED的组合(好吧,我只是讨厌不可见的窗口)。

当您填写JTextArea时,它会将JScrollPane“添加”到已经“打包”的窗口中,因此组件的大小已经更改,然后当容器重新生效时,那里会发生什么已经不再有足够的空间将所有字段打包成其首选大小,因此它们的大小已经调整为最小尺寸,通常为0x0或足够近。

您可以采取一些措施来帮助解决问题。您可以使用GridBagConstraints#fill并使用GridBagConstraints.HORIZONTAL作为文本字段,使用GridBagConstraints.BOTH作为文本区域,这将允许字段“填充”并占用列的可用空间/ row,无论单元格空间何时小于组件的首选大小。

您可能还会发现GridBagConstraints#weightx/y 1可以提供帮助。

如果您遇到麻烦,可以在ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS中使用JScrollPane,虽然不是很漂亮,但会在JScrollBar大小中添加JScrollPane当窗口打包时

<强>更新

所以,基本上,我最终使用fillweightx/y的组合来JScrollPaneJTextArea s

g1.fill = GridBagConstraints.BOTH;
g1.weightx = 1;
g1.weighty = 1;
adminPanel1.add(descTxtPane, g1);
g1.fill = GridBagConstraints.NONE;
g1.weightx = 0;
g1.weighty = 0;

对于JTextField我刚刚使用的fill似乎已经稳定了......

g1.fill = GridBagConstraints.HORIZONTAL;
adminPanel1.add(idTxt, g1);
g1.fill = GridBagConstraints.NONE;

这导致类似......

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.regex.Pattern;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.filechooser.FileNameExtensionFilter;

public class AdminWindow extends JDialog implements ActionListener {

    private JPanel adminPanel1, adminPanel2, adminPanel3;
    private JTabbedPane tabPane;
    private GridBagConstraints g1, g2, g3;
    private JLabel idLbl, showLbl, descLbl, ageLbl, imgLbl, timeLbl, screenLbl,
            stanLbl, vipLbl, idLbl1, showLbl1, descLbl1, ageLbl1, imgLbl1, imgName;
    private JTextField idTxt, showTxt, imgTxt, timeTxt, stanTxt, vipTxt,
            idTxt1, showTxt1, imgTxt1;
    private JTextArea descTxt, descTxt1;
    private JComboBox ageCb, ageCb1, screenCb, timeCb, showingCb;
    private JScrollPane descTxtPane, descTxtPane1;
    private ArrayList<String> screenList, timeList, showingList;
    private DefaultComboBoxModel screenModel, timeModel, showingModel;
    private JButton submit, clear, seatSubmit, seatClear, addBtn, subBtn,
            submit1, clear1, imgBtn;
    private double stanPrice, vipPrice;
    private String stanPriceString, vipPriceString, priceExpression, imgString;
    private Pattern p;
    private File dest, chosenFile;

    public AdminWindow() {

        //frame properties
        setTitle("Admin Panel");
        //setSize(Dimensions.getScreenWidth() - 100, Dimensions.getScreenHeight() - 100);
        setAlwaysOnTop(true);
//        setResizable(false);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);

        //regular expression validations
        priceExpression = "[0-9]{1,2}[.]{1}[0-9]{2}";
        p = Pattern.compile(priceExpression);

        //panel dec
        tabPane = new JTabbedPane();
        adminPanel1 = new JPanel();
        adminPanel2 = new JPanel();
        adminPanel3 = new JPanel();
        g1 = new GridBagConstraints();
        g2 = new GridBagConstraints();
        g3 = new GridBagConstraints();

        //label dec
        idLbl = new JLabel("Film ID");
        showLbl = new JLabel("Film Name");
        descLbl = new JLabel("Film Description");
        ageLbl = new JLabel("Age Rating");
        imgLbl = new JLabel("Image");
        idLbl1 = new JLabel("Film ID");
        showLbl1 = new JLabel("Film Name");
        descLbl1 = new JLabel("Film Description");
        ageLbl1 = new JLabel("Age Rating");
        imgLbl1 = new JLabel("Image");
        timeLbl = new JLabel("Showing Times");
        screenLbl = new JLabel("Screen Number");
        stanLbl = new JLabel("Standard Ticket Cost (£)");
        vipLbl = new JLabel("VIP Ticket Cost (£)");
        imgName = new JLabel("filename.jpg");

        //label properties
//        imgName.setPreferredSize(new Dimension(100, 20));

        //txttfield dec
        idTxt = new JTextField(4);
        showTxt = new JTextField(30);
        descTxt = new JTextArea(4, 30);
        descTxtPane = new JScrollPane(descTxt, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        imgTxt = new JTextField();
        idTxt1 = new JTextField(4);
        showTxt1 = new JTextField(30);
        descTxt1 = new JTextArea(4, 30);
        descTxtPane1 = new JScrollPane(descTxt1, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        imgTxt1 = new JTextField();
        timeTxt = new JTextField(4);
        stanTxt = new JTextField(4);
        vipTxt = new JTextField(4);

        //textfield properties
        idTxt1.setEditable(false);
        descTxt.setWrapStyleWord(true);
        descTxt.setLineWrap(true);

        //drop-down dec
        ageCb = new JComboBox();
        ageCb1 = new JComboBox();
        screenCb = new JComboBox();
        timeCb = new JComboBox();
        showingCb = new JComboBox();

        //dropdown properties
//        timeCb.setPreferredSize(new Dimension(60, 23));

        //buttons
        submit = new JButton("Submit");
        clear = new JButton("Clear");
        submit1 = new JButton("Submit");
        clear1 = new JButton("Clear");
        seatSubmit = new JButton("Submit");
        seatClear = new JButton("Show Current");
        addBtn = new JButton("+");
        subBtn = new JButton("-");
        imgBtn = new JButton("Browse..");

        //button properties
        addBtn.setFocusPainted(false);
        subBtn.setFocusPainted(false);
        addBtn.setMargin(new Insets(0, 5, 0, 5));
        subBtn.setMargin(new Insets(0, 5, 0, 5));

        //listeners
        submit.addActionListener(this);
        clear.addActionListener(this);
        seatSubmit.addActionListener(this);
        seatClear.addActionListener(this);
        addBtn.addActionListener(this);
        subBtn.addActionListener(this);
        imgBtn.addActionListener(this);

        //fill price text fields with existing prices
        defaultForm();

        //add items to jcombobox
        ageCb.addItem("U");
        ageCb.addItem("12A");
        ageCb.addItem("15");
        ageCb.addItem("18");
        ageCb1.addItem("U");
        ageCb1.addItem("12A");
        ageCb1.addItem("15");
        ageCb1.addItem("18");

        //panel properties
        adminPanel1.setLayout(new GridBagLayout());
        adminPanel2.setLayout(new GridBagLayout());
        adminPanel3.setLayout(new GridBagLayout());
        adminPanel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "New Showing"));
        adminPanel2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Seat Prices"));
        adminPanel3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.black), "Edit Showing"));

        //ading panels to tabbed pane
        tabPane.addTab("Add Showings", null, adminPanel1, "Add new showings & showing times");
        tabPane.addTab("Seat Prices", null, adminPanel2, "Change seat prices");
        tabPane.addTab("Edit Showing", null, adminPanel3, "Edit existing showing");

        //-----adding components to pane--------------------------------------!
        g1.gridx = 0;
        g1.gridy = 0;
        g1.insets = new Insets(10, 0, 0, 10);
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(idLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
    g1.fill = GridBagConstraints.HORIZONTAL;
    adminPanel1.add(idTxt, g1);
    g1.fill = GridBagConstraints.NONE;
        g1.gridy++;
        g1.gridx--;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(showLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        g1.gridwidth = 4;
        g1.fill = GridBagConstraints.HORIZONTAL;
        adminPanel1.add(showTxt, g1);
        g1.fill = GridBagConstraints.NONE;
        g1.gridwidth = 1;
        g1.gridy++;
        g1.gridx--;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(descLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        g1.gridwidth = 4;
        g1.fill = GridBagConstraints.BOTH;
        g1.weightx = 1;
        g1.weighty = 1;
        adminPanel1.add(descTxtPane, g1);
        g1.fill = GridBagConstraints.NONE;
        g1.weightx = 0;
        g1.weighty = 0;
        g1.gridwidth = 1;
        g1.gridy++;
        g1.gridx--;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(ageLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        adminPanel1.add(ageCb, g1);
        g1.gridy++;
        g1.gridx--;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(imgLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        g1.gridwidth = 2;
        adminPanel1.add(imgBtn, g1);
        g1.gridx = 3;
        adminPanel1.add(imgName, g1);
        g1.gridwidth = 1;
        g1.gridy++;
        g1.gridx = 0;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(screenLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        adminPanel1.add(screenCb, g1);
        g1.gridx--;
        g1.gridy++;
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(timeLbl, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        g1.fill = GridBagConstraints.HORIZONTAL;
        adminPanel1.add(timeTxt, g1);
        g1.fill = GridBagConstraints.NONE;
        g1.gridx++;
        adminPanel1.add(addBtn, g1);
        g1.gridx++;
        adminPanel1.add(timeCb, g1);
        g1.gridx++;
        adminPanel1.add(subBtn, g1);
        //buttons
        g1.gridy++;
        g1.gridx = 0;
        g1.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
        g1.anchor = GridBagConstraints.LINE_END;
        adminPanel1.add(clear, g1);
        g1.gridx++;
        g1.anchor = GridBagConstraints.LINE_START;
        g1.gridwidth = 4;
        adminPanel1.add(submit, g1);
        g1.gridwidth = 1;

        //------adding components to panel2-----------------------------------!
        //left
        g2.gridx = 0;
        g2.gridy = 0;
        g2.insets = new Insets(10, 10, 0, 10);
        g2.anchor = GridBagConstraints.LINE_END;
        adminPanel2.add(stanLbl, g2);
        g2.gridy++;
        adminPanel2.add(vipLbl, g2);
        g2.gridy++;
        adminPanel2.add(seatClear, g2);
        //right
        g2.gridy = 0;
        g2.gridx++;
        g2.anchor = GridBagConstraints.LINE_START;
        g2.fill = GridBagConstraints.HORIZONTAL;
        adminPanel2.add(stanTxt, g2);
        g2.fill = GridBagConstraints.NONE;
        g2.gridy++;
        g2.fill = GridBagConstraints.HORIZONTAL;
        adminPanel2.add(vipTxt, g2);
        g2.fill = GridBagConstraints.NONE;
        g2.gridy++;
        adminPanel2.add(seatSubmit, g2);

        //-----adminpanel3-----------------------------------------------------
        //adding components to panel1
        g3.gridx = 1;
        g3.gridy = 0;
        g3.insets = new Insets(10, 0, 0, 10);
        g3.anchor = GridBagConstraints.LINE_START;
        g3.gridwidth = 4;
        adminPanel3.add(showingCb, g3);
        g3.gridwidth = 1;
        g3.gridx--;
        g3.gridy++;
        g3.anchor = GridBagConstraints.LINE_END;
        adminPanel3.add(idLbl1, g3);
        g3.gridx++;
        g3.anchor = GridBagConstraints.LINE_START;
        g3.fill = GridBagConstraints.HORIZONTAL;
        adminPanel3.add(idTxt1, g3);
        g3.fill = GridBagConstraints.NONE;
        g3.gridy++;
        g3.gridx--;
        g3.anchor = GridBagConstraints.LINE_END;
        adminPanel3.add(showLbl1, g3);
        g3.gridx++;
        g3.anchor = GridBagConstraints.LINE_START;
        g3.gridwidth = 5;
        g3.fill = GridBagConstraints.HORIZONTAL;
        adminPanel3.add(showTxt1, g3);
        g3.fill = GridBagConstraints.NONE;
        g3.gridwidth = 1;
        g3.gridy++;
        g3.gridx--;
        g3.anchor = GridBagConstraints.LINE_END;
        adminPanel3.add(descLbl1, g3);
        g3.gridx++;
        g3.anchor = GridBagConstraints.LINE_START;
        g3.gridwidth = 4;
        g3.fill = GridBagConstraints.BOTH;
        g3.weightx = 1;
        g3.weighty = 1;
        adminPanel3.add(descTxtPane1, g3);
        g3.fill = GridBagConstraints.NONE;
        g3.weightx = 0;
        g3.weighty = 0;
        g3.gridwidth = 1;
        g3.gridy++;
        g3.gridx--;
        g3.anchor = GridBagConstraints.LINE_END;
        adminPanel3.add(ageLbl1, g3);
        g3.gridx++;
        g3.anchor = GridBagConstraints.LINE_START;
        adminPanel3.add(ageCb1, g3);
        g3.gridy++;
        g3.gridx--;

        //buttons
        g3.gridy++;
        g3.gridx = 0;
        g3.insets = new Insets(10, 0, 10, 10); //top, right, bottom, left
        g3.anchor = GridBagConstraints.LINE_END;
        adminPanel3.add(clear1, g3);
        g3.gridx++;
        g3.anchor = GridBagConstraints.LINE_START;
        g3.gridwidth = 4;
        adminPanel3.add(submit1, g3);
        g3.gridwidth = 1;

        //adding tabbed pane to frame
        this.add(tabPane);
        this.pack();

        //visibility
        setVisible(true);
        tabPane.setVisible(true);

        //actionlisteners
    }

    public static void main(String[] args) {
        AdminWindow test = new AdminWindow();
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == imgBtn) {

            //--JFileChooser, ugly but better to use--
            String userDir = System.getProperty("user.home");
            JFileChooser chooser = new JFileChooser(userDir + "/Desktop");
            int choice = chooser.showDialog(this, "Choose");
            if (choice != JFileChooser.APPROVE_OPTION) {
                return;
            }

            FileNameExtensionFilter filter = new FileNameExtensionFilter("Image Files", "jpg", "png", "gif", "jpeg");
            chooser.setAcceptAllFileFilterUsed(false);
            chooser.addChoosableFileFilter(filter);
            chosenFile = chooser.getSelectedFile();
            imgName.setText(chosenFile.getName());
            dest = new File(System.getProperty("user.dir") + "/src/iegroup/resources", chosenFile.getName());
            imgString = "resources/" + chosenFile.getName();
            System.out.println(dest.toPath());
        }

        if (e.getSource() == submit) {

            if (e.getSource() == clear) {

            }

            if (e.getSource() == seatSubmit) {

            }
        }
        if (e.getSource() == seatClear) {
            defaultForm();
        }

        if (e.getSource() == addBtn) {

            timeModel.addElement(timeTxt.getText());
            timeList.add(timeTxt.getText());
        }
        if (e.getSource() == subBtn) {
            timeModel.removeElement(timeCb.getSelectedItem());
            timeList.remove(timeCb.getSelectedItem());
        }
    }

    private void defaultForm() {

        stanPriceString = String.format("%.2f", stanPrice);
        vipPriceString = String.format("%.2f", vipPrice);
        stanTxt.setText(stanPriceString);
        vipTxt.setText(vipPriceString);
    }

    public void showValidationPrompt(String message) {
        JFrame validFrame = new JFrame();
        validFrame.setAlwaysOnTop(true);
        JOptionPane.showMessageDialog(validFrame, message, "Invalid input", JOptionPane.CLOSED_OPTION);

    }

    public void showSuccessPrompt(String message) {
        JFrame errorFrame = new JFrame();
        errorFrame.setAlwaysOnTop(true);
        JOptionPane.showMessageDialog(errorFrame, message, "Success", JOptionPane.CLOSED_OPTION);

    }
}