Hallo,
Ich habe mir eine eigene JComboBox geschrieben(also mit vererbung), damit diese Spalten hat. Nun habe ich ein kleines Problem:
Ich habe eine Klasse names CustomComboBox geschrieben, die von JComboBox geerbt ist. in dieser setze ich ein paar Eigenschaften und setze auch den Renderer, welchen ich auch in einer anderen Klasse selbst überschrieben habe. In meiner Test Klasse habe ich 2 Comboboxen mit unterschiedlichen Spalten anzahlen erstellt. Doch kommt jetzt ein Fehler. Denn komischerweise wird wenn ich die zweite box erstelle die Spaltenzahl an beide Comboboxen weitergegeben. Also die erste Combobox hat dann nicht mehr 4 spalten sondern 6. Und damit gibt es eine IndexOutOfBounceException, da ja das DatenObjekt von der ersten Box nur 4 Groß ist und nicht 6. Aber warum wird die erste Box verändert, wenn ich die zweite erstelle?
Bitte um Hilfe! Danke!
Hier die Renderer Klasse:
Hier meine ComboBox Klasse:
Hier noch die sizes Klasse die man braucht:
und Hier meine Test Klasse:
Ich habe mir eine eigene JComboBox geschrieben(also mit vererbung), damit diese Spalten hat. Nun habe ich ein kleines Problem:
Ich habe eine Klasse names CustomComboBox geschrieben, die von JComboBox geerbt ist. in dieser setze ich ein paar Eigenschaften und setze auch den Renderer, welchen ich auch in einer anderen Klasse selbst überschrieben habe. In meiner Test Klasse habe ich 2 Comboboxen mit unterschiedlichen Spalten anzahlen erstellt. Doch kommt jetzt ein Fehler. Denn komischerweise wird wenn ich die zweite box erstelle die Spaltenzahl an beide Comboboxen weitergegeben. Also die erste Combobox hat dann nicht mehr 4 spalten sondern 6. Und damit gibt es eine IndexOutOfBounceException, da ja das DatenObjekt von der ersten Box nur 4 Groß ist und nicht 6. Aber warum wird die erste Box verändert, wenn ich die zweite erstelle?
Bitte um Hilfe! Danke!
Hier die Renderer Klasse:
Java:
package renderer;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.GridLayout;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import net.miginfocom.swing.MigLayout;
public class ComboBoxRenderer extends JPanel implements ListCellRenderer{
private int columnHeader = 5;
private Color colorColumnHeader = Color.GRAY;
public static JLabel[] columnCount;
int[] columnWidhts;
private String[] header;
boolean isHeader = false;
JLabel left = new JLabel();
JLabel mid = new JLabel();
JLabel right = new JLabel();
public ComboBoxRenderer(int column, Object[][] data, boolean hasHeader){
columnCount = null;
columnHeader = 0;
columnWidhts = null;
header = null;
columnWidhts = new int[column];
columnWidhts = renderer.sizes.setLabelSize(data, getFontMetrics(getFont()), column);
columnCount = new JLabel[column];
isHeader = hasHeader;
for(int i = 0; i < columnCount.length; ++i){
columnCount[i] = new JLabel();
}
setLayout(new MigLayout("fill", "fill", "fill"));
for(int i = 0; i < column; ++i){
add(columnCount[i], "west");
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if(isSelected){
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}else{
setBackground(list.getBackground());
setForeground(list.getForeground());
}
boolean valid = false;
if(value instanceof Object[]){
Object[] columns = (Object[])value;
if(columnCount != null){
if(isHeader){
for(int i = 0; i < columnCount.length; ++i){
columnCount[i].setText((String)columns[i]);
columnCount[i].setPreferredSize(new Dimension(columnWidhts[i], 16));
columnCount[i].setMinimumSize(new Dimension(columnWidhts[i], 16));
columnCount[i].setMaximumSize(new Dimension(columnWidhts[i], 16));
columnCount[i].setSize(new Dimension(columnWidhts[i], 16));
columnCount[i].setBackground(colorColumnHeader);
columnCount[i].setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.BLACK));
isHeader = false;
}
}else{
for(int i = 0; i < columnCount.length; ++i){
columnCount[i].setText((String)columns[i]);
columnCount[i].setPreferredSize(new Dimension(columnWidhts[i], 16));
columnCount[i].setMinimumSize(new Dimension(columnWidhts[i], 16));
columnCount[i].setMaximumSize(new Dimension(columnWidhts[i], 16));
columnCount[i].setSize(new Dimension(columnWidhts[i], 16));
columnCount[i].setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.BLACK));
}
}
}else{
if(columns.length == 3){
valid = true;
left.setText((String)columns[0]);
mid.setText((String)columns[1]);
right.setText((String)columns[2]);
}else{
left.setText("invalid");
mid.setText("invalid");
right.setText("invalid");
}
}
}
return this;
}
}
Hier meine ComboBox Klasse:
Java:
package renderer;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
public class CustomComboBox extends JComboBox {
private String type;
private boolean layingOut = false;
private int widestLengh = 0;
private boolean wide = false;
private int itemSTateCHangedCount = 0;
int columnCount = 0;
int lineWidth = 0;
boolean isColumnNamed = false;
int[] columnWidths;
private ComboBoxRenderer renderer;
public CustomComboBox(Object[][] data, int[] weights){
columnCount = data[0].length;
renderer = new ComboBoxRenderer(columnCount, weights);
setRenderer(renderer);
for(int i = 0; i < data.length; ++i){
Object[] fill = new Object[data[0].length];
for(int i2 = 0; i2 < data[0].length; ++i2){
fill[i2] = data[i][i2];
}
addItem(fill);
}
}
public CustomComboBox(Object[][] data){
columnCount = data[0].length;
renderer = new ComboBoxRenderer(columnCount, data);
setRenderer(renderer);
columnWidths = sizes.setLabelSize(data, getFontMetrics(getFont()), data[0].length);
for(int i = 0; i < columnWidths.length; ++i){
lineWidth += columnWidths[i];
}
for(int i = 0; i < data.length; ++i){
Object[] fill = new Object[data[0].length];
for(int i2 = 0; i2 < data[0].length; ++i2){
fill[i2] = data[i][i2];
}
addItem(fill);
}
setEditable(true);
addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
if(itemSTateCHangedCount == 1){
itemSTateCHangedCount = 3;
if(isColumnNamed){
if(getSelectedItem().equals(getItemAt(0))){
setSelectedIndex(1);
}
}
if(getSelectedItem() instanceof Object[]){
Object[] items = (Object[])getSelectedItem();
setSelectedItem(items[0]);
}else{
setSelectedItem(getSelectedItem());
}
itemSTateCHangedCount = 0;
}else{
if(itemSTateCHangedCount == 3){
return;
}
++itemSTateCHangedCount;
}
}
});
if(getSelectedItem() instanceof Object[]){
Object[] items = (Object[])getSelectedItem();
setSelectedItem(items[0]);
}else{
setSelectedItem(getSelectedItem());
}
}
public CustomComboBox(Object[][] data, Object[] columnNames){
Object[][] dataNew = null;
setColumnNamed(true);
if(data.length == 0){
dataNew = new Object[1][columnNames.length];
}else{
dataNew = new Object[data.length + 1][data[0].length];
}
for(int i = 0; i < dataNew[0].length; ++i){
dataNew[0][i] = columnNames[i];
}
for(int i = 1; i < dataNew.length; ++i){
for(int i2 = 0; i2 < dataNew[0].length; ++i2){
dataNew[i][i2] = data[i - 1][i2];
}
}
columnCount = dataNew[0].length;
renderer = new ComboBoxRenderer(columnCount, dataNew, true);
setRenderer(renderer);
columnWidths = sizes.setLabelSize(dataNew, getFontMetrics(getFont()), dataNew[0].length);
for(int i = 0; i < columnWidths.length; ++i){
lineWidth += columnWidths[i];
}
for(int i = 0; i < dataNew.length; ++i){
Object[] fill = new Object[dataNew[0].length];
for(int i2 = 0; i2 < dataNew[0].length; ++i2){
fill[i2] = dataNew[i][i2];
}
addItem(fill);
}
setEditable(true);
addItemListener(new ItemListener(){
@Override
public void itemStateChanged(ItemEvent e) {
if(itemSTateCHangedCount == 1){
itemSTateCHangedCount = 3;
if(isColumnNamed == true){
if(getSelectedItem().equals(getItemAt(0))){
if(getItemCount() == 1){
setSelectedItem("");
}else{
setSelectedIndex(1);
}
}
}
if(getSelectedItem() instanceof Object[]){
Object[] items = (Object[])getSelectedItem();
setSelectedItem(items[0]);
}else{
setSelectedItem(getSelectedItem());
}
itemSTateCHangedCount = 0;
}else{
if(itemSTateCHangedCount == 3){
return;
}
++itemSTateCHangedCount;
}
}
});
if(getSelectedItem() instanceof Object[]){
Object[] items = (Object[])getSelectedItem();
setSelectedItem(items[0]);
}else{
setSelectedItem(getSelectedItem());
}
if(getItemCount() == 1){
setSelectedItem("");
}else{
setSelectedIndex(1);
}
}
public CustomComboBox(){
}
public CustomComboBox(Object[] data){
for(int i = 0; i < data.length; ++i){
addItem(data[i]);
}
}
public Object getSelectedItemOnScreen(){
if(getSelectedItem() instanceof Object[]){
Object[] items = (Object[])getSelectedItem();
return items;
}else{
Object item = getSelectedItem();
int count = getItemCount();
for(int i = 0; i < count; ++i){
if(getItemAt(i) instanceof Object[]){
Object[] get = (Object[])getItemAt(i);
if(get[0].equals(item)){
Object[] items = (Object[])getItemAt(i);
return items;
}
}else{
if(getItemAt(i).equals(item)){
Object items = getItemAt(i);
return items;
}
}
}
}
return getSelectedItem();
}
public int getColumnCount(){
return columnCount;
}
public boolean isWide() {
return wide;
}
//Setting the JComboBox wide
public void setWide(boolean wide) {
this.wide = wide;
widestLengh = getWidestItemWidth();
}
public Dimension getSize(){
Dimension dim = super.getSize();
if(!layingOut && isWide())
dim.width = Math.max( lineWidth +20, dim.width);
return dim;
}
public int getWidestItemWidth()
{
int numOfItems = this.getItemCount();
Font font = this.getFont();
FontMetrics metrics = this.getFontMetrics( font );
int widest = 0;
int columns = columnCount;
for ( int i = 0; i < numOfItems; i++ ){
Object[] item = (Object[])this.getItemAt( i );
int lineWidth = 0;
for(int i2 = 0; i2 < columnCount; ++i2){
lineWidth += metrics.stringWidth( item[i2].toString() ) + 5;
}
widest = Math.max( widest, lineWidth );
}
return widest;
}
public void doLayout(){
try{
layingOut = true;
super.doLayout();
}finally{
layingOut = false;
}
}
public String getType() {
return type;
}
public void setType( String t ) {
type = t;
}
public void setColumnNamed(boolean value){
isColumnNamed = value;
}
public boolean isColumnNamed(){
return isColumnNamed;
}
}
Hier noch die sizes Klasse die man braucht:
Java:
package renderer;
import java.awt.Font;
import java.awt.FontMetrics;
public class sizes {
public static int[] setLabelSize(Object[][] data, FontMetrics metrics, int column){
int itemCount = data.length;
int maxWidht = 0;
int[] columnWidths = new int[column];
for(int i2 = 0; i2 < data[0].length; ++i2){
maxWidht = 0;
for(int i = 0; i < itemCount; ++i){
int lineWidht = 0;
//System.out.println(data[i][i2]);
lineWidht = metrics.stringWidth((String)data[i][i2]) + 10;
maxWidht = Math.max(maxWidht, lineWidht);
}
columnWidths[i2] = maxWidht;
}
return columnWidths;
}
}
und Hier meine Test Klasse:
Java:
package frame;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.border.EmptyBorder;
import renderer.ComboBoxRenderer;
import renderer.CustomComboBox;
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.factories.FormFactory;
import javax.swing.SpringLayout;
import net.miginfocom.swing.MigLayout;
import javax.swing.JComboBox;
public class frmTest extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
frmTest frame = new frmTest();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public frmTest() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
Object[][] data = new Object[0][0];
String[] headerNames = new String[]{"tja","lol","hi","miau"};
int[] weights = {20,20,20, 20};
ComboBoxRenderer renderer = new ComboBoxRenderer();
final CustomComboBox testCB = new CustomComboBox();
testCB.setRenderer(new ComboBoxRenderer(4, data, true));
testCB.setWide(true);
CustomComboBox cbhi = new CustomComboBox();
cbhi.setRenderer(new ComboBoxRenderer(6, new Object[][]{{"tja","lol","hi", "lkl","rf","fd"}}, true));
GroupLayout gl_contentPane = new GroupLayout(contentPane);
gl_contentPane.setHorizontalGroup(
gl_contentPane.createParallelGroup(Alignment.TRAILING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(115)
.addComponent(testCB, GroupLayout.PREFERRED_SIZE, 158, GroupLayout.PREFERRED_SIZE)
.addContainerGap(151, Short.MAX_VALUE))
.addGroup(gl_contentPane.createSequentialGroup()
.addContainerGap(285, Short.MAX_VALUE)
.addComponent(cbhi, GroupLayout.PREFERRED_SIZE, 129, GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
gl_contentPane.setVerticalGroup(
gl_contentPane.createParallelGroup(Alignment.LEADING)
.addGroup(gl_contentPane.createSequentialGroup()
.addGap(31)
.addComponent(cbhi, GroupLayout.PREFERRED_SIZE, 42, GroupLayout.PREFERRED_SIZE)
.addGap(19)
.addComponent(testCB, GroupLayout.PREFERRED_SIZE, 62, GroupLayout.PREFERRED_SIZE)
.addContainerGap(97, Short.MAX_VALUE))
);
contentPane.setLayout(gl_contentPane);
}
}