2015-12-15 4 views
0

Я имею проблему отображения последнего JComboBox, я использую GridBagLayout все выглядит, как я хочу, чтобы это последний компонент с именами cat1, CAT2 и CAT3JComboBox не появляется в GridBagLayout

Я пытался добавить, за исключением a JLabel в конец и установка его .weightx как .REMAINDER, но даже эта метка не отображается.

Я попытался изменить свойство .gridwidth, но не напрасно.

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

Я до сих пор немного новичок в GridBaGLayout(), и я все еще не мог понять свою проблему, Я пробовал искать другие коды и ответы в Интернете, но я просто не мог найти свою ошибку! Вы можете мне помочь?

P.S. Я просто поставил основной метод, чтобы вы могли тестировать, это вызвано из другого класса, поэтому у него могут быть некоторые ошибки запуска (надеюсь, нет);

import java.awt.BorderLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 


public class selectioins implements ActionListener 
{ 
    JFrame f; 
    JPanel p; 
    JButton searchB, viewB, newB; 
    JTextField search1F,search2F,search3F; 
    JComboBox logic1,logic2,logic3, cart1,cart2,cart3; 

    String[] carterias = {"First name:","Last name"}; 
    String[] logic = {"Disabled","AND","OR","NOT"}; 

    char Type = 'c'; 
    public static void main(String[] args) 
    { 
     new selectioins('c'); 
    } 
    public selectioins(char type) 
    { 
     //##### Initialization ##### 
     String head = ""; 
     if(type=='c'){ head = "Customer"; Type = 'c';} 
     if(type=='e'){ head = "Employee"; Type = 'e';} 
     f = new JFrame(head +" Search"); 
     p = new JPanel(); 

     search1F = new JTextField(); 
     search2F = new JTextField(); 
     search3F = new JTextField(); 

     searchB = new JButton("Search"); 
     newB = new JButton("New entry"); 

     logic1 = new JComboBox(logic); 
     logic2 = new JComboBox(logic); 
     logic3 = new JComboBox(logic); 
     cart1 = new JComboBox(carterias); 
     cart2 = new JComboBox(carterias); 
     cart3 = new JComboBox(carterias); 

     searchB.addActionListener(this); 
     newB.addActionListener(this); 

     //##### layout settings ##### 
     p.setLayout(new GridBagLayout()); 

     GridBagConstraints gbc4f = new GridBagConstraints(); 
     gbc4f.fill = GridBagConstraints.BOTH; 
     gbc4f.anchor = GridBagConstraints.NORTHWEST; 
     gbc4f.gridwidth = GridBagConstraints.REMAINDER; 
     gbc4f.weightx = 0.75; 
     gbc4f.insets = new Insets(1, 1, 1, 1); 

     GridBagConstraints gbc4l = (GridBagConstraints) gbc4f.clone(); 
     gbc4l.weightx = 0.1; 
     gbc4l.gridwidth = 1; 


     GridBagConstraints gbc4cmb = (GridBagConstraints) gbc4f.clone(); //ComboBox 
     gbc4cmb.anchor = GridBagConstraints.NORTHWEST; 
     gbc4cmb.insets = new Insets(1, 1, 1, 1); 
     gbc4cmb.gridwidth = GridBagConstraints.RELATIVE; 


     //##### adding components ##### 
     p.add(new JLabel("Search for:"),gbc4l); p.add(search1F,gbc4cmb); 
     p.add(new JLabel("in:"),gbc4l);   p.add(cart2,gbc4cmb); 
     p.add(new JLabel(" 1"),gbc4f);   p.add(logic1,gbc4f); 

     p.add(new JLabel("That has:"),gbc4l); p.add(search2F,gbc4cmb); 
     p.add(new JLabel("in:"),gbc4l);   p.add(cart2,gbc4cmb); 
     p.add(new JLabel(" 11 "),gbc4f);   p.add(logic2,gbc4f); 

     p.add(new JLabel("Also has:"),gbc4l); p.add(search3F,gbc4cmb); 
     p.add(new JLabel("in:"),gbc4l);   p.add(cart3,gbc4cmb); 
     p.add(new JLabel("3 "),gbc4f); 

     p.add(searchB,gbc4cmb); 
     p.add(newB,gbc4cmb); 


     //##### Containers finalizing ##### 
     f.add(p,BorderLayout.NORTH); 
     //f.setResizable(false); 
     f.setBounds(600,400,400,300); 
     f.setVisible(true); 
    } 




    public void actionPerformed(ActionEvent e) 
    {} 
} 
+0

Не совсем ответ на ваш вопрос, но я предполагаю, что вы бы лучше не с помощью «МиГ Layout», что делает макеты в JFC/Swing гораздо проще ... Http: //www.miglayout. com/(... то есть, если вы не вынуждены использовать GridBagLayout, потому что в вашем проекте не разрешено использование сторонних библиотек или вы работаете над какой-то домашней задачей и не имеете другого выбора .....) – headcr4sh

+0

@ headcr4sh Я в этом вхожу, и я хочу сначала получить GridBagLayout .. а также у меня нет много времени, чтобы переучивать другого менеджера макетов, так как это проект из-за менее чем за 48 часов, и все еще есть вещи для быть финализированным. но спасибо за рецензию, я планирую скоро ее изучить. – bakz

+0

вы уверены, что не используете одни и те же GBC? Gbc4cmb выглядит так же, как и для добавления search3F. –

ответ

1

После многих попыток мне удалось это исправить.

Я удалил атрибут GridBagLayout.RELATIVE и изменил его на 1 в gbc4cmb, и он сработал!

GridBagConstraints gbc4cmb = (GridBagConstraints) gbc4f.clone(); //ComboBox 
     gbc4cmb.anchor = GridBagConstraints.NORTHWEST; 
     gbc4cmb.insets = new Insets(1, 1, 1, 1); 
     gbc4cmb.gridwidth = 1; 
+0

Отлично! Всегда приятно найти такое маленькое изменение, которое делает такую ​​большую разницу. –

0

Вы не совсем понимаете, как работает GridBagLayout. Для каждого компонента необходимы ограничения. Это означает, что каждый компонент получает другое ограничение. В вашем примере вы используете тот же GridBagConstraint для добавления разных компонентов (например, gbc4cmb используется примерно 6 раз!).

В общем случае ограничение не должно использоваться более одного раза, иначе у вас будут компоненты, перекрывающиеся друг с другом (потому что они имеют одинаковые x, y).

+1

Вы можете использовать тот же GridBagConstraint для разных JComponents. Вы должны изменить значения GBC для каждого JComponent, но вы можете использовать тот же GBC. Я считаю использование одного GBC запутанным, но это разрешено. –

+0

Я знаю об этой точке, и поскольку x, y не заданы по умолчанию и автоматически переключаются, в противном случае все они будут в одной и той же ячейке, я ошибаюсь? – bakz

+0

Менеджер компоновки создает копию объекта ограничений, предоставляемого при добавлении компонента. Таким образом, вы можете создать одно и просто обновить координаты (и другие ограничения, если применимо), когда вы начнете добавлять каждый компонент. Я обычно называю мой 'c' и повторно использую одно и то же имя локальной переменной для каждого. Я также склонен использовать 'c.gridx + = 1' или' c.gridy + = 1' для установки координат по мере продолжения. – dsh

0

Вы также можете рассмотреть возможность использования BoxLayout и панелей для каждой строки в вашем графическом интерфейсе, где каждая панель использует FlowLayout. Скриншот:

Screenshot example

Код:

import java.awt.*; 
import javax.swing.*; 

public class SelectionsAlternative { 
    private static final String[] CRITERIA = {"First name", "Last name"}; 
    private static final String[] OPERATORS = {"Disabled", "AND", "OR", "NOT"}; 

    public static void main(String[] arguments) { 
     SwingUtilities.invokeLater(() -> new SelectionsAlternative().createAndShowGui()); 
    } 

    private void createAndShowGui() { 
     JFrame frame = new JFrame("Stack Overflow"); 
     int width = 800; 
     int height = 600; 
     frame.setBounds(100, 100, width, height); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS)); 

     addCriterion(mainPanel); 
     addOperator(mainPanel); 
     addCriterion(mainPanel); 
     addOperator(mainPanel); 
     addCriterion(mainPanel); 

     Dimension minimumSize = new Dimension(width, 10); 
     Dimension preferredSize = new Dimension(width, height); 
     mainPanel.add(new Box.Filler(minimumSize, preferredSize, preferredSize)); 

     frame.getContentPane().add(mainPanel); 
     frame.setVisible(true); 
    } 

    private void addCriterion(JPanel mainPanel) { 
     JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING)); 
     panel.add(new JLabel("Search for:")); 
     panel.add(new JTextField(28)); 
     panel.add(new JLabel("in:")); 
     panel.add(new JComboBox<>(CRITERIA)); 
     mainPanel.add(panel); 
    } 

    private void addOperator(JPanel mainPanel) { 
     JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING)); 
     panel.add(new JComboBox<>(OPERATORS)); 
     mainPanel.add(panel); 
    } 
} 
Смежные вопросы