Auswahlliste in Form einer Tabelle

DexXxtrin

Erfahrenes Mitglied
Hallo zusammen,

Ich hab mich nun ein wenig über JList und JTable informiert und die Möglichkeiten angeschaut. Allerdings sehe ich nicht wie ich mit vertretbarem Aufwand zu meiner Wunschlösung komme (und ich denke das sollte möglich sein). Bevor ich nun beginne mit etwas und das Rad neu erfinde, wollte ich nachfragen, ob es einen "einfachen" Weg gibt, eine Auswahlliste in Form einer Tabelle darzustellen. Es ist für ein Spiel und sollte wie in der Angehängten Grafik "funktionieren/aussehen", sprich man kann nur eine ganze Zeile auswählen. Auf einer Zeilen sind mehrere Angaben (inkl. Bilder) in Spalten geordnet.
screenshot2011121314485.jpg

Besten Dank schon im voraus für Lösungshinweise.

Gruss DexXxtrin
 
Das ist keine Liste, sondern eine Tabelle und das funktioniert schon alles so. Was ist denn dein eigentliches Problem?
 
Wie kann ich die Tabelle so anpassen, dass die in dieser Art aussieht und funktioniert? Muss ich da wirklich diverse Sachen überschreiben oder geht das einfacher?
 
Es gibt entsprechende Methoden, um z.B. das Selektionsverhalten zu steuern, z.B. nur eine Zeile (setSelectionMode()). Die API kann dir da sicher ganz gut helfen.

Und was meinst du mit "in dieser Art aussieht"? So schön bunt wie auf dem Bild? Naja, das Aussehen der Komponenten hängt vom jeweiligen LookAndFeel ab, das verwendet wird. Man kann ein paar Sachen, wie Vordergrund- und Hintergrundfarbe und noch ein paar Sachen mehr auch so direkt beeinflussen, aber eine tolle bunte Tabelle, die optisch nicht mit dem Rest der Anwendung harmoniert, bringt doch überhaupt nichts.
 
Es harmoniert schon mit dem Rest der Anwendung ;)

Hab mich jetzt dazu entschiden, selber etwas zu machen. Dabei verwende ich JPanel und JScrollPane. Ich zeichne nun den gewolten Inhalt auf ein JPanel, welches eine Zeile darstellt. Diese Zeilen füge ich einem weiteren (normalen) JPanel hinzu und diese wird wiederum dem JScrollPane hinzugefügt. Soweit so gut und es funktioniert. Allerdings stellt es mir dieses JScrollPane erst dar, wenn ich hineinklicke und mit dem Mausrad scrolle.
Zudem verzieht es die Elemente beim Scrollen. Was hab ich vergessen, mach ich falsch?

Java:
public class TableRow extends JPanel {
    private int Col = 180;
    private TableList owner;
    private BufferedImage biRow;
    private Graphics2D g2d;
    private boolean even;
    private String name;
    private String ip;
    private int win;
    private int lose;
    private boolean isPlay;
    
    private BufferedImage icoPlay;
    private BufferedImage icoSword;
    private BufferedImage icoSwordHO;
    private BufferedImage icoCancel;
    private BufferedImage icoCancelHO;
    private BufferedImage icoAccept;
    private BufferedImage icoAcceptHO;
    private BufferedImage icoErase;
    private BufferedImage icoEraseHO;
    
    public TableRow(boolean isPlay, String name, String ip, int win, int lose, boolean even, TableList owner){
        
        this.owner = owner;
        this.even = even;
        this.isPlay = isPlay;
        this.name = name;
        this.ip = ip;
        this.win = win;
        this.lose = lose;
        
        this.setPreferredSize(new Dimension(owner.getTableWidth(), owner.getRowHeight()));
 
        this.biRow = new BufferedImage(owner.getTableWidth(), owner.getRowHeight(),BufferedImage.TYPE_INT_ARGB);
        g2d = biRow.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setFont(new Font("Arial",Font.PLAIN, 13));
        g2d.setColor(Color.BLACK);
        g2d.drawString(name,30,owner.getRowHeight()-5);
        g2d.drawString(ip,200,owner.getRowHeight()-5);
        loadIcons();
        
        int c = Col+(even?1:0)*20;
        this.setBackground(new Color(c,c,c, 191));
        this.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.GRAY));
        drawCenterSTring(Integer.toString(win),65,350,owner.getRowHeight()-5);
        drawCenterSTring(Integer.toString(lose),65,415,owner.getRowHeight()-5);
        if(isPlay)
            g2d.drawImage(icoPlay, 3, 1, this);
        else
            g2d.drawImage(icoSword, 478, 1, this);
        
    }
    
    private void loadIcons(){
        try{
            icoPlay = ImageIO.read(new File("src/TableList/icons/cannon.png"));
            icoSword = ImageIO.read(new File("src/TableList/icons/sword.png"));
            icoSwordHO = ImageIO.read(new File("src/TableList/icons/sword_hover.png"));
            icoCancel = ImageIO.read(new File("src/TableList/icons/cancel.png"));
            icoCancelHO = ImageIO.read(new File("src/TableList/icons/cancel_hover.png"));
            icoAccept = ImageIO.read(new File("src/TableList/icons/check.png"));
            icoAcceptHO = ImageIO.read(new File("src/TableList/icons/check_hover.png"));
            icoErase = ImageIO.read(new File("src/TableList/icons/eraser.png"));
            icoEraseHO = ImageIO.read(new File("src/TableList/icons/eraser_hover.png"));
        }catch(IOException e){
            System.out.println(e.getMessage());
        }
    }

    private void drawCenterSTring(String s, int width, int XPos, int YPos){  
            int stringLen = (int)g2d.getFontMetrics().getStringBounds(s, g2d).getWidth();  
            int start = width/2 - stringLen/2; 
            g2d.drawString(s, start + XPos, YPos);  
    } 
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);       
        g.drawImage(biRow, 0, 0, this);
    }
}

Java:
public class TableList extends JPanel{
    private int table_width = 530;
    private int row_height = 22;
    private int rows = 20;
    private int table_height = rows * row_height;
    private int viewport_height = 300;
    private ArrayList<String> test = new ArrayList<>();
    
    public TableList(){
        //super();
        this.setBackground(new Color(255,255,255,0));
        this.setOpaque(false);
        this.setSize(new Dimension(table_width, viewport_height));

        JPanel table = new JPanel();
        table.setOpaque(false);
        table.setLayout(new GridLayout(rows,1));//null);
        table.setSize(new Dimension(table_width, table_height));
        
        TableRow[] row = new TableRow[rows];
        for(int i=0; i<row.length; i++){
            row[i] = new TableRow((i%2==0)?true:false,"Hans","168.192.0.1",5,7,(i%2==0)?true:false,this);
            table.add(row[i]);
        }

        JScrollPane scrollPane = new JScrollPane(table, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED ,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollPane.setColumnHeaderView(new TableHeader(this,false));
        scrollPane.setCorner(JScrollPane.UPPER_RIGHT_CORNER, new TableHeader(this,true));
        scrollPane.setOpaque(false);
        scrollPane.getViewport().setOpaque(false);
        scrollPane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
        scrollPane.setBorder(null);
        scrollPane.setSize(table_width, viewport_height);
        scrollPane.setLocation(0, 0);
        this.add(scrollPane);
    }
    
    protected int getTableWidth(){
        return table_width;
    }
    
    protected int getTableHeight(){
        return table_height;
    }
    
    protected int getRowHeight(){
        return row_height;
    }    
}

Screenshots: oben wie es sein sollte, unten beim scrollen
scrollproblem.jpg
 
Zuletzt bearbeitet:
Zurück