Obramowanie wewnątrz tabeli

0

Witam serdecznie, mam tabelę 9x9 reprezentującą planszę popularnej łamigłówki. Kod GUI mojego programu wygląda następująco:

private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        plansza = new javax.swing.JTable();
        btn_wyczysc = new javax.swing.JButton();
        btn_rozwiaz = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        textarea = new javax.swing.JTextArea();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        liczba_iteracji = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        czas = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Sudoku");
        setResizable(false);

        plansza.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION));
        plansza.setFont(new java.awt.Font("Tahoma", 1, 18));
        plansza.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null}
            },
            new String [] {
                "", "", "", "", "", "", "", "", ""
            }
        ));
        plansza.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        plansza.setRowHeight(35);
        jScrollPane1.setViewportView(plansza);

        btn_wyczysc.setText("Wyczyść");
        btn_wyczysc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_wyczyscActionPerformed(evt);
            }
        });

        btn_rozwiaz.setText("Rozwiąż");
        btn_rozwiaz.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_rozwiazActionPerformed(evt);
            }
        });

        textarea.setColumns(20);
        textarea.setEditable(false);
        textarea.setRows(5);
        jScrollPane2.setViewportView(textarea);

        jLabel1.setFont(new java.awt.Font("Tahoma", 0, 18));
        jLabel1.setText("Program rozwiązujący Sudoku za pomocą algorytmu Douglasa - Rachforda");

        jLabel2.setText("Liczba iteracji:");

        jLabel3.setText("Czas wykonania:");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 338, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 310, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(btn_rozwiaz, javax.swing.GroupLayout.DEFAULT_SIZE, 165, Short.MAX_VALUE)
                            .addComponent(btn_wyczysc, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(jLabel2)
                                    .addComponent(jLabel3))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(liczba_iteracji, javax.swing.GroupLayout.DEFAULT_SIZE, 78, Short.MAX_VALUE)
                                    .addComponent(czas, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 78, Short.MAX_VALUE)))))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(40, 40, 40)
                        .addComponent(jLabel1)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btn_wyczysc)
                        .addGap(18, 18, 18)
                        .addComponent(btn_rozwiaz)
                        .addGap(55, 55, 55)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2)
                            .addComponent(liczba_iteracji, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel3)
                            .addComponent(czas, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap())
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 318, Short.MAX_VALUE)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 318, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(36, 36, 36))))
        );

        pack();
    }// </editor-fold>                        

Mam wielki problem - jak zrobić grubsze obramowanie wokół każdego kwadratu 3x3? Mógłby ktoś w miarę jasno pochwalić się swoją wiedzą? Męczę się z tym już długo i żadnych rezultatów. Dziękuję i pozdrawiam

0
random(nick) napisał(a)

Rozwiązanie problemu http://4programmers.net/Forum/636961?h=sudoku#id636961

hehe racja, dzięki!

0

Cieszę się że znalazłeś rozwiązanie. Imho JTable nie jest właściwym komponentem do wyświetlania planszy. Dla Sudoku dobrym rozwiązaniem jest JPanel z rozkładem GridLayout(3,3), każdy umieszczany na nim komponent jest znów typu JPanel z rozkładem GridLayout(3,3). Poniżej przykład, obramowania mają grubość 1 lub 2, odstępy mają 2 lub 4 piksle.
user image

0
bo napisał(a)

Cieszę się że znalazłeś rozwiązanie. Imho JTable nie jest właściwym komponentem do wyświetlania planszy. Dla Sudoku dobrym rozwiązaniem jest JPanel z rozkładem GridLayout(3,3), każdy umieszczany na nim komponent jest znów typu JPanel z rozkładem GridLayout(3,3). Poniżej przykład, obramowania mają grubość 1 lub 2, odstępy mają 2 lub 4 piksle.
user image

Hej! A mógłbyś pokazać kod tej planszy? Będę bardzo wdzięczny...Bardzo mi się przyda... Pozdrawiam i dziękuję

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

public class Sudoku extends JFrame
{
    private Pole[][] pola=new Pole[9][9];
    //------------------------
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new  Runnable()
        {
            public void run()
            {
                new Sudoku().createAndShowGUI();
            }
        });    
    }
    //------------------------
    public Sudoku()
    {
        super("Sudoku");
        setLayout(new GridLayout(3,3,4,4));
        //nadawanie polom losowych wartości
        Random r=new Random();
        for(int w=0;w<9;w++)
        {
            for(int k=0;k<9;k++)
            {
                String s="";
                if((w+k)%3==0)
                {
                    s=""+(r.nextInt(7)+1);
                }
                pola[w][k]=new Pole(s);
            }
        }
    }
    //------------------------
    private void createAndShowGUI()
    {
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                JPanel p=new JPanel();
                p.setLayout(new GridLayout(3,3,2,2));
                p.setBorder(BorderFactory.createLineBorder(Color.BLACK,2));
                for(int w=0;w<3;w++)
                {
                    for(int k=0;k<3;k++)
                    {
                        p.add(pola[3*i+w][3*j+k]);
                    }
                }
                add(p);
           }
        }
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);    
    }
}
//------------------------------------------------
class Pole extends JPanel
{
    public Pole(String txt)
    {
        setPreferredSize(new Dimension(40,30));
        setBorder(BorderFactory.createLineBorder(Color.BLACK,1));
        setLayout(new FlowLayout(FlowLayout.CENTER));
        add(new JLabel(txt));
    }
}
0

Ale ja chcę mieć jedną tabelę, na której chcę wykonywać obliczenia... Czy ta technika zadziała?

0

A co to jest?

   private Pole[][] pola=new Pole[9][9];

Na potrzeby obliczeń możesz trochę rozbudować klasę Pole dodając składową typu int.

0
bo napisał(a)

A co to jest?

   private Pole[][] pola=new Pole[9][9];

Na potrzeby obliczeń możesz trochę rozbudować klasę Pole dodając składową typu int.

Dzięki za pomoc, ale dalej nie wiem jak to zastosować do mojego problemu. Chcę wyświetlić tabelę (z obramowaniami kwadratów 3x3), do której wpiszę z klawiatury jakieś liczby... Bardzo proszę o jeszcze jedną podpowiedź... Może ktoś wie chociaż jak pokolorować kwadraty 3x3? Nieważne jakim sposobem, ważne by najłatwiej jak się da... Co muszę w moim kodzie zmienić/dopisać? Proszę o pomoc.

0

Błagam, pomóżcie! Pilnie potrzebuję tego obramowania, albo chociaż zmiany koloru tła dla każdego kwadratu 3x3 - proszę o pomoc jak to zrobić mając ten mój kod... Sprawa naprawdę na wagę złota

0

Jak pilnie potrzebujesz? Twojego sposobu nie będę ruszał. mój mogę uzupełnić - najwcześniej na czwartek, na pewno na sobotę.

0
bo napisał(a)

Jak pilnie potrzebujesz? Twojego sposobu nie będę ruszał. mój mogę uzupełnić - najwcześniej na czwartek, na pewno na sobotę.

To ten Twój sposób raczej odpada, bo mam już napisany program, który działa na tablicy... Musiałbym dużo rzeczy w nim pozmieniać, a w czwartek, najpóźniej w piątek program musi być gotowy... Trudno, bedzie bez obramowania...Ale wielkie dzięki za chęci - mało jest dziś takich ludzi...

PS. A może wiesz jak szybko z mojego kodu zrobić tak, by kwadratom 3x3 dać jakieś tło?

Pozdrawiam

0

W konstruktorze klasy Pola dodaj np.
setBackground(Color.YELLOW);
i zwiększ grubość obramowania i zmień może kolor:
setBorder(BorderFactory.createLineBorder(Color.RED,2));

0

Do kolorowania komórek tabeli użyj własnego CellRenderera.

TableCellRenderer renderer=new myRenderer();
//dla każdej kolumny
kol.setCellRenderer(renderer);
..............
public class CellRenderer implements TableCellRenderer
{
    private Color selectedOdd=new Color(240,159,24);
    private Color selectedEven=new Color(24,159,240);
    private Color unselectedOdd=new Color(160,106,16);
    private Color unselectedEven=new Color(16,106,160);
    //------------------------
    public Component getTableCellRendererComponent(JTable t,Object value,boolean selected,boolean hasFocus,int row,int col)
    {
        String text=value.toString();
        JLabel header=new JLabel(text,JLabel.CENTER);
        header.setOpaque(true);
        if(selected)
        {
            if(jakiś warunek)
                header.setBackground(selectedEven);
            else
               header.setBackground(selectedOdd);
            
        }
        else
        {
            if(jakiś warunek)
                header.setBackground(unselectedEven);
            else
               header.setBackground(unselectedOdd);
        }
        return header;
    }
}

Powyższy przykład zmienia kolor tła komórki w zależności od "pewnego warunku" i od tego czy komórka jest zaznaczona.

1 użytkowników online, w tym zalogowanych: 0, gości: 1