# jbutton + icon  icon an button anpassen, wie?



## iconfreak (23. Dez 2007)

Ich habe in meinem GUI einen JButton der ein gewisses Icon (gif) zugewiesen wird, aber der Button ist dann größer als das Icon, wie passe ich den Button an das Icon an?


[  |    |   ]     <-- So ist es      [         ]  = Button          |    |   = ICON

|    |     <---so sollte es ausschaun

danke 

mfg iconfreak


----------



## André Uhres (24. Dez 2007)

jButton1.setMargin(new java.awt.Insets(0, 0, 0, 0));


----------



## iconfreak (24. Dez 2007)

danke vielmals, den befehl hab ich wirklih gesucht, udn wie mache ich den abstand zw den buttons kleiner?
das es so ausschaut?  |  ||  |            und nichth so:     |   |   |    |

danke mfg


----------



## André Uhres (24. Dez 2007)

Beim FlowLayout (= default für JPanel) geht's z.B. mit setHgap:
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/FlowLayout.html
Welches Layout benutzt du, bzw. in welchem Container sind die JButtons?


----------



## Guest (24. Dez 2007)

ich benutze das flowlayout und container habe ich keinen gesetzt..

code:


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

public class b extends JFrame
{
    public static void main(String[] Args)
    {

       
        JFrame frame = new JFrame("a");
        frame.setLayout(new FlowLayout());
        setHgap(0);      //<-----------Fehler...Methode nicht gefunden
        Icon icon = new ImageIcon("new.gif");
        JButton b1 = new JButton("", icon);
        JButton b2 = new JButton("", icon);
        
        
        b2.setMargin(new java.awt.Insets(0, 0, 0, 0));
        b1.setMargin(new java.awt.Insets(0, 0, 0, 0));
        frame.add(b2);
        frame.add(b1);
        frame.pack();
        
        frame.setVisible(true);
    }
}
```

es ist nur eine testklasse, nicht wundern


----------



## André Uhres (24. Dez 2007)

"setHgap" ist ja auch keine Methode von JFrame, sondern von FlowLayout. Du kannst die Gaps aber auch direkt im Konstruktor setzen:
new FlowLayout(FlowLayout.CENTER, 0, 0)


----------



## Guest (24. Dez 2007)

oh, ok danke,aber wenn ich es so wie du es beschrieben hast mache, skaliert er mir den button auf die framesize und macht nur noch in der mitte das kleine icon, habe versucht es irgendwie zu ändern. aber das ergebnis war immer das gleiche, hab den buttonabstand damit nicht regulieren können, oder mache ich etwas brutal falsch?

mfg danke iconfreak


----------



## André Uhres (24. Dez 2007)

Ich glaub du beherschst die Grundlagen von Java noch nicht so richtig :wink:
frame.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));


----------



## iconfreak (25. Dez 2007)

omg, ok, ich sollte langsam wieder mein gehirn anstrengen gg, aber danke 

ich hätte noch 2 letzte fragen um alles zu perfektionieren 

so schaut es derzeit aus:








ich habe den button, wie entferne ich den rand von dem button?
ich habe den button, wie entferne ich das "java" "jbutton" design, also das es wie ein awt Button() aussieht? (also ohne so einen schönen verlauf sondern nur weiss und icon oben)

danke vielmals für deine mühen für einen kleiner anfänger wie mcih


----------



## L-ectron-X (25. Dez 2007)

Um den Fokusrahmen zu entfernen:

```
button.setFocusPainted(false);
```

Um den Button wie ein AWT-Button aussehen zu lassen fügst du in deine main()-Methode noch vor der Initialisierung irgendwelcher GUI-Elemente folgenden Code ein:

```
try {
   UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e) {
   e.printStackTrace();
}
```


----------



## André Uhres (25. Dez 2007)

Vielleicht hilft dir dieses Beispiel auch weiter: IconTest.jar (Quellcode im jar)
Ich weiss nämlich überhaupt nicht, was du vorhast.


----------



## Guest (26. Dez 2007)

danke, das was du mir zum Download gegeben hast ist genau was ich gesucht habe, doch ich habe noch ein problem, und zwar wenn ich das jar entpacke und die klasse öffne und die icons in den richtigen ordner verschiebe kommt trotzdem folgende fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(ImageIcon.java:138)
	at IconTest.initComponents(IconTest.java:33)
	at IconTest.<init>(IconTest.java:13)
	at IconTest$1.run(IconTest.java:67)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

Doch wie kann das sein wenn ich doch eigentlich das schon fertig compilierte programm öffne!? - sollte doch einwandfrei funktionieren


----------



## Wildcard (26. Dez 2007)

Ohne mir den Quelltext angesehen zu haben, vermute ich, dass André die Resourcen über den Classloader (Class#getResource) lädt.
Die Resourcen müssen sich daher im Classpath deines Projekts befinden, damit der Classloader sie finden kann.


----------



## Guest (26. Dez 2007)

Verfasst am: 26. 12. 2007, 0:28    Titel: 

Ohne mir den Quelltext angesehen zu haben, vermute ich, dass André die Resourcen über den Classloader (Class#getResource) lädt. 
Die Resourcen müssen sich daher im Classpath deines Projekts befinden, damit der Classloader sie finden kann.

Ordner:

[test]
->IconTest.class
       [Icons]
         ---> die icons.gif



[] = ORDNER

mfg


----------



## André Uhres (26. Dez 2007)

Anonymous hat gesagt.:
			
		

> ..die icons in den richtigen ordner verschiebe..


Schon mit den icons im "falschen" ordner probiert? Das müsste nämlich der richtige  sein  :?


----------



## Guest (26. Dez 2007)

hab jetzt alle kreationen ausprobiert, meiner meinung nach müsste:

[test] darin die .class + .java und [icons] drin sein...

was könnte sonst noch der fehler sein?


----------



## Guest (26. Dez 2007)

sry für doppelpost:

hier der code, der ordner icons wurde jetzt einfach gelöscht --- so ist das mal keine fehlerquelle mehr, hab den source code dementsprechend geändert und die bilder (wenn auch sinnlos in 1.gif 2.gif) umgeändert

code:


```
import javax.swing.UIManager;

public class IconTest extends javax.swing.JFrame 
{
    public IconTest() 
    {
        try 
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } 
        catch (Exception ex) 
        {
        }
        initComponents();
    }

    private void initComponents() 
    {

        toolBar = new javax.swing.JToolBar();
        btNew = new javax.swing.JButton();
        btEdit = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();
        btNew1 = new javax.swing.JButton();
        btEdit1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("IconTest");

        toolBar.setBorder(javax.swing.BorderFactory.createTitledBorder("JToolBar"));
        toolBar.setFloatable(false);
        toolBar.setRollover(true);

        btNew.setIcon(new javax.swing.ImageIcon(getClass().getResource("1.gif")));
        btNew.setFocusable(false);
        btNew.setMargin(new java.awt.Insets(0, 0, 0, 0));
        toolBar.add(btNew);

        btEdit.setIcon(new javax.swing.ImageIcon(getClass().getResource("2.gif")));
        btEdit.setFocusable(false);
        btEdit.setMargin(new java.awt.Insets(0, 0, 0, 0));
        toolBar.add(btEdit);

        getContentPane().add(toolBar, java.awt.BorderLayout.PAGE_START);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("JPanel"));
        jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 0, 0));

        btNew1.setIcon(new javax.swing.ImageIcon(getClass().getResource("1.gif")));
        btNew1.setFocusable(false);
        btNew1.setMargin(new java.awt.Insets(0, 0, 0, 0));
        jPanel1.add(btNew1);

        btEdit1.setIcon(new javax.swing.ImageIcon(getClass().getResource("2.gif")));
        btEdit1.setFocusable(false);
        btEdit1.setMargin(new java.awt.Insets(0, 0, 0, 0));
        jPanel1.add(btEdit1);

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-400)/2, (screenSize.height-300)/2, 400, 300);
    }
    
    public static void main(String args[]) 
    {
        java.awt.EventQueue.invokeLater(new Runnable() 
        {
            public void run() 
            {
                new IconTest().setVisible(true);
            }
        });
    }
    private javax.swing.JButton btEdit;
    private javax.swing.JButton btEdit1;
    private javax.swing.JButton btNew;
    private javax.swing.JButton btNew1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JToolBar toolBar;
}
```

fehler:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(ImageIcon.java:138)
	at IconTest.initComponents(IconTest.java:39)
	at IconTest.<init>(IconTest.java:14)
	at IconTest$1.run(IconTest.java:71)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)


----------



## Guest (26. Dez 2007)

ok gelöst, hat auch seine zeit gekostet, dnake für alles


----------



## SebiB90 (26. Dez 2007)

kannste uns sagen, wie du es gelöst hast?


----------



## Guest (26. Dez 2007)

ähm... ich bin alles nochmal durchgegangen weil ich total den überblick verloren habe, zudem kommt nach das einer der gifs einen falschen namen hatte,....... aber jetzt geht es, nur ich habe gleich ein neues problem:

ich habe es mit Flow und border layout versucht doch es einfach nicht hinbekommen, hab mir sogar die tutorails durchgelesen, nur irgendwas mach ich falsch:





ich möchte das wie zb in word die toolbar oben ist, über den table, wie geht das?
des weiteren - warum verändern die buttons sich wieder zu JButtons und sind nciht mehr im awt stil?

mfg danke


----------



## Guest (26. Dez 2007)

code: 

```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.DefaultTableModel;

public class Tabelle extends JFrame
{
    public Tabelle()
    {
        try
        {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }
        catch(Exception ex) 
        {
            ex.printStackTrace();
        }
    }
    
    public static void main(String[] Args)
    {
        //frame
        JFrame frame = new JFrame("Tabellenübung");
        frame.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
        
        
        //menu
        JMenuBar menu = new JMenuBar(); 
        JMenu tablemenu = new JMenu("Tabelle");
        JMenuItem newrow = new JMenuItem("Reihe hinzufügen");
        
        frame.setJMenuBar(menu);
        menu.add(tablemenu);
        tablemenu.add(newrow);
        
        //toolbar
        JToolBar toolbar = new JToolBar();
        JButton btNew   = new JButton();
        JButton btEdit  = new JButton();
        
        btNew.setIcon(new ImageIcon("btNew.gif"));
        btNew.setFocusable(false);
        btNew.setMargin(new java.awt.Insets(0, 0, 0, 0));
        
        btEdit.setIcon(new ImageIcon("btOpen.gif"));
        btEdit.setFocusable(false);
        btEdit.setMargin(new java.awt.Insets(0, 0, 0, 0));
        
        //table
        String[][] row = { {"", "", "", "", ""}};
        String[] colum = {"NR.", "Name", "Genre", "Größe", "Ausgeborgt"};
        
        final JTable table = new JTable(new DefaultTableModel(row, colum));
        JScrollPane pane = new JScrollPane(table);
        
        //add to frame
        frame.add(toolbar);
        frame.add(btNew);
        frame.add(btEdit);
        frame.add(pane);
        
        frame.pack();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setVisible(true);
        
        //actionListener
        newrow.addActionListener(new ActionListener() 
        { 
            public void actionPerformed(ActionEvent e) 
            { 
                DefaultTableModel model = (DefaultTableModel)table.getModel(); 
                // Das hier durch sinnvolle Daten ersetzen 
                model.addRow(new Object[model.getRowCount()]); 
            } 
        });        
    }
}
```


----------



## SebiB90 (26. Dez 2007)

benutz mal borderlayout
und dann

```
add(toolBar, BorderLayout.PAGE_START);
```


----------



## Guest (26. Dez 2007)

ok, das setzt den 1. butotn nach oben udn skaliert ihn über die ganze breite, wieso das auf einmal, das wurde doch unten (bei jedem button) geändert oO


----------



## SebiB90 (26. Dez 2007)

du willst doch das die buttons auf der toolbar sind oder?
dann musste auch die buttons der toolbar hinzufügen und nicht dem frame...


----------



## Guest (26. Dez 2007)

ok, das wär mal gelöst, und jetzt will ich noch das man die spalten sortieren kann, hab dazu ein nettes tut gefunden, doch wenn ich es compile gehts nicht 


```
//package components;

/*
 * TableSortDemo.java requires no other files.
 */

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import java.awt.Dimension;
import java.awt.GridLayout;

public class TableSortDemo extends JPanel {
    private boolean DEBUG = false;

    public TableSortDemo() {
        super(new GridLayout(1,0));

        JTable table = new JTable(new MyTableModel());
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);     <----------findet er nicht
        table.setAutoCreateRowSorter(true);

        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);

        //Add the scroll pane to this panel.
        add(scrollPane);
    }

    class MyTableModel extends AbstractTableModel {
        private String[] columnNames = {"First Name",
                                        "Last Name",
                                        "Sport",
                                        "# of Years",
                                        "Vegetarian"};
        private Object[][] data = {
            {"Mary", "Campione",
             "Snowboarding", new Integer(5), new Boolean(false)},
            {"Alison", "Huml",
             "Rowing", new Integer(3), new Boolean(true)},
            {"Kathy", "Walrath",
             "Knitting", new Integer(2), new Boolean(false)},
            {"Sharon", "Zakhour",
             "Speed reading", new Integer(20), new Boolean(true)},
            {"Philip", "Milne",
             "Pool", new Integer(10), new Boolean(false)},
        };

        public int getColumnCount() {
            return columnNames.length;
        }

        public int getRowCount() {
            return data.length;
        }

        public String getColumnName(int col) {
            return columnNames[col];
        }

        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        /*
         * JTable uses this method to determine the default renderer/
         * editor for each cell.  If we didn't implement this method,
         * then the last column would contain text ("true"/"false"),
         * rather than a check box.
         */
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        /*
         * Don't need to implement this method unless your table's
         * editable.
         */
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
            if (col < 2) {
                return false;
            } else {
                return true;
            }
        }

        /*
         * Don't need to implement this method unless your table's
         * data can change.
         */
        public void setValueAt(Object value, int row, int col) {
            if (DEBUG) {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }

            data[row][col] = value;
            fireTableCellUpdated(row, col);

            if (DEBUG) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }

        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();

            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("TableSortDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        TableSortDemo newContentPane = new TableSortDemo();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
```

hab auch in google nachgeschaut, ich hab nur 4 einträge gefunden die niht hilfreich waren - oder kennt wer noch ein ebessere methode die spalten zu sortieren?


----------



## André Uhres (26. Dez 2007)

http://java.sun.com/javase/downloads/index.jsp
http://www.java-forum.org/de/viewtopic.php?p=248550


----------

