Java mySql + array ?

Java mySql + array ?
I3
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:42
0

Cześć wszystkim

Mam problem z aplikacja, wszystko działa tak jak powinno tylko problem polega na tym, chciałbym aby można było zrobić update tylko po nazwie nie wpisując wszystkie pola, oraz jak nie wpisze nic w żadne pola to żeby pojawiła się informacja nie dokonano żadnego wpisu lub coś podobnego ale nie wiem jak. Czy zastosować array ?, był by może ktoś w stanie wyjaśnić jak albo wkleić kod przykładowy abym mógł się odnieść.

Dziękuję z góry.

Kopiuj
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.JTextField;
import net.proteanit.sql.DbUtils;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.awt.event.ActionEvent;

public class main extends javax.swing.JFrame {

	Connection con =null;
	ResultSet rs=null;
	PreparedStatement pts=null;
	
	private JFrame frame;
	private JTextField textField;
	private JTextField textField_1;
	private JTextField textField_2;
	private JTextField textField_3;
	private JTable DB;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					main window = new main();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

		/**
	 * Create the application.
	 */
	public main() {
		initialize();
		connection();
		fetch();
		
	}
/*Metoda łączenie */
public void connection(){
	
	Statement st = null;
	try{
	con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/bookshop","root","Password");
	st = con.createStatement();
	}catch(Exception ex){
		JOptionPane.showMessageDialog(null,ex.getMessage());
	}
}
	

/* Metoda to pobierania danych z sql*/	
public void fetch(){
	try{
		String q="select * from book";
		pts=con.prepareStatement(q);
		rs=pts.executeQuery();
		
		DB.setModel(DbUtils.resultSetToTableModel(rs));
	}catch(Exception e){
		JOptionPane.showMessageDialog(null, e);
	}
	
	}
	

/*Metoda używana do przycisków : Insert,Update,Delete */
public void theQuery(String query){

	Connection con = null;
	Statement st = null;
	try{
		con = DriverManager.getConnection("jdbc:mysql://localhost/bookshop","root","Password");
		st = con.createStatement();
		st.executeUpdate(query);
		}catch(Exception ex){
			JOptionPane.showMessageDialog(null,ex.getMessage());
		}
}
	
	/**
	 * Tworzenie ramy i całego layoutu
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 768, 522);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
/*Przycisk insert + metoda*/
		JButton btnNewButton = new JButton("Insert");
		btnNewButton.addActionListener(new ActionListener() {
			     public void actionPerformed(ActionEvent e) {
		         try(ResultSet rs = pts.executeQuery())
		         {
		             theQuery("insert into book (bookname,authorname,price) values('"+textField_1.getText()+"','"+textField_2.getText()+"',"+textField_3.getText()+")");
		             JOptionPane.showMessageDialog(null, "Book inserted successfully");
		         }
		         catch(Exception ex){}
		     	}
		});
		btnNewButton.setBounds(22, 160, 89, 23);
		frame.getContentPane().add(btnNewButton);
		
/*Przycisk usuń + metoda */ 
		JButton btnNewButton_1 = new JButton("Delete");
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try{
			          
		             theQuery("delete from book where bookID = "+textField.getText());
		             JOptionPane.showMessageDialog(null, "Book deleted");
		         }
		         catch(Exception ex){}
			}
		});
		btnNewButton_1.setBounds(22, 228, 89, 23);
		frame.getContentPane().add(btnNewButton_1);
		
/* Przycisk update */
		JButton btnNewButton_2 = new JButton("Update");
		btnNewButton_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try{	         
			         theQuery("update book set bookName = '"+textField_1.getText()+"',authorName = '"+textField_2.getText()+"', price = "+textField_3.getText()+" where bookID      = "+textField.getText());
			         if(theQuery(paramString() != null) {
			        	 JOptionPane.showMessageDialog(null, "No data was entered");
			         }
			         else{	 
			         
			         JOptionPane.showMessageDialog(null, "Price update Successfully");
			         }
			         }
			         
			         catch(Exception ex){}
			         }
		});
		btnNewButton_2.setBounds(22, 194, 89, 23);
		frame.getContentPane().add(btnNewButton_2);
		
		textField = new JTextField();
		textField.setBounds(133, 35, 86, 20);
		frame.getContentPane().add(textField);
		textField.setColumns(10);
		
		textField_1 = new JTextField();
		textField_1.setColumns(10);
		textField_1.setBounds(133, 64, 86, 20);
		frame.getContentPane().add(textField_1);
		
		textField_2 = new JTextField();
		textField_2.setColumns(10);
		textField_2.setBounds(133, 95, 86, 20);
		frame.getContentPane().add(textField_2);
		
		textField_3 = new JTextField();
		textField_3.setColumns(10);
		textField_3.setBounds(133, 126, 86, 20);
		frame.getContentPane().add(textField_3);
		
		JLabel lblNewLabel = new JLabel("Book ID");
		lblNewLabel.setBounds(22, 35, 73, 20);
		frame.getContentPane().add(lblNewLabel);
		
		JLabel lblBookName = new JLabel("Book Name");
		lblBookName.setBounds(22, 67, 73, 20);
		frame.getContentPane().add(lblBookName);
		
		JLabel lblBookAuthor = new JLabel("Book Author");
		lblBookAuthor.setBounds(22, 98, 73, 20);
		frame.getContentPane().add(lblBookAuthor);
		
		JLabel lblPrice = new JLabel("Price");
		lblPrice.setBounds(22, 129, 73, 20);
		frame.getContentPane().add(lblPrice);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(241, 38, 478, 405);
		frame.getContentPane().add(scrollPane);
		
		
                DB = new JTable();
		scrollPane.setViewportView(DB);
/*Przycisk Odswież*/
		JButton btnRefresh = new JButton("Refresh");
		btnRefresh.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				fetch();
			}
		});
		btnRefresh.setBounds(22, 262, 89, 23);
		frame.getContentPane().add(btnRefresh);
	}
}

edytowany 8x, ostatnio: Ic3m4n
EL
  • Rejestracja:około 13 lat
  • Ostatnio:4 miesiące
0

Wrzuć najpierw tagi bo oczopląsu można dostać po czytaniu tego.

edytowany 1x, ostatnio: eL
I3
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:42
0

Troche lepiej powinno być teraz

EL
  • Rejestracja:około 13 lat
  • Ostatnio:4 miesiące
0

Po kolei. Problemy masz 2:

Ic3m4n napisał(a):

chciałbym aby można było zrobić update tylko po nazwie nie wpisując wszystkie pola

  1. Ale co to znaczy że chciałbyś zrobić update po nazwie? Chcesz aktualizować tylko nazwę książki?
Ic3m4n napisał(a):

jak nie wpisze nic w żadne pola to żeby pojawiła się informacja nie dokonano żadnego wpisu lub coś podobnego

  1. Przed wysłaniem zapytania pobierz wszystkie wartości z pół tak jak to zresztą robisz, np.:
Kopiuj
textField_2.getText()

i sprawdź czy pole jest wypełnione, np:

Kopiuj
if (textField_2.getText() == null || textField_2.getText().isEmpty()){
                    showErrorMessage();

Twoich pól jest bodajże 4 więc nie pisz tego byle gdzie byleby wyglądała jak ta wyżej x4 bo będzie to strasznie nieczytelne. Dodaj jakąś metodę np:

Kopiuj
 
private boolean strIsEmpty(String){
   return textField_2.getText() == null || textField_2.getText().isEmpty();
}

I obsłuż to podając wartości tamtych pól. A w ogóle najlepiej by było nową klasę np. FieldValidator i tam sprawdź czy wszystkie pola są wypełnione.
PS. Przeczytaj książkę "Czysty Kod". Jeśli Twój projekt działa to super, ale warto też zacząć robić kroki w poprawieniu jakości kodu bo straszny antypattern tu pokazałeś.

edytowany 2x, ostatnio: eL
I3
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:42
0

Dzięki za pomoc, jeżeli chodzi o update to przykładowo chciałbym zmienić cenę jednej z książek które są w bazie i nie chce wpisywać wszystkich pól tylko nazwę książki i oczywiście cenę.
Kod poprawie bo tak jak pisałeś wygląda dość nietypowo.

EL
  • Rejestracja:około 13 lat
  • Ostatnio:4 miesiące
0
Ic3m4n napisał(a):

Dzięki za pomoc, jeżeli chodzi o update to przykładowo chciałbym zmienić cenę jednej z książek które są w bazie i nie chce wpisywać wszystkich pól tylko nazwę książki i oczywiście cenę.

Oczywiście da się to zrobić ale jak obsłużysz takie sytuacje:

  1. Co powinno się stać jeśli w bazie będą 2 książki z tym samym tytułem (inny autor, inne id itd, jedynie tytuły się pokryły)?
  2. Co jeśli zrobisz literówkę w nazwie książki i chciałbyś aktualizować w książce tylko tytuł?

Na razie pytam tylko teoretycznie o scenariusz (nie o konkretne rozwiązanie) co powinno się wydarzyć jeśli napotkasz powyższe sytuacje.

edytowany 2x, ostatnio: eL
I3
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:42
0

BookId powinno być inkementowane automatycznie ale nie do końca wiem jak to zrobić, i to by rozwiązało problem z dwoma tymi samymi książkami, jeżeli chodzi o tytuł to nie miałem takiej instrukcji, wykładowcy chodziło tylko o zmianę ceny podając tylko nazwę książki.

EL
  • Rejestracja:około 13 lat
  • Ostatnio:4 miesiące
0

Aaa no to pisz że to projekt studencki ;)
BookId będzie inkrementowane automatycznie po stronie bazy jeśli dodasz do Id 2 rzeczy:

  1. Primary key ( http://www.w3schools.com/sql/sql_primarykey.asp ) - chociaż to pewnie masz
  2. Auto_increment ( http://www.w3schools.com/SQl/sql_autoincrement.asp )

Nie używam JDBC ale wydaje mi się że możesz bez problemu zrobić tak:

  1. Wpisujesz tylko tytuł książki który jest wymagany + pola które chcesz aktualizować.
  2. Robisz selecta na bazie i pobierasz książkę o tytule który wpisałeś.
  3. Następnie na tym co Ci zwróci (będziesz już miał ID książki) aktualizujesz pola które chcesz zmienić (ważne tylko jest żebyś wcześniej sprawdził które pola zostały wypełnione a nie na ślepo wszystkie ustawił bo wtedy Ci się ustawią też puste pola w miejscu w którym nic nie podałeś).
  4. Robisz normalny update.
edytowany 2x, ostatnio: eL
I3
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:42
0

Dzięki wielkie za pomoc, jutro będę próbował coś zmieniać dzisiaj już nie dam rady, ciężki dzień za mną.

Pozdrawiam.

0

Mam problem żadne z polecen nie chce mi działać. Wskazania mam takie :

  • zobaczyć wszystkie książki w sklepie
  •   dodanie nowej książki do bazy
    
  • zrobić update ceny używając nazwy książki
  • usunięcie książki używając jej nazwy

Co robię nie tak ?

Kopiuj
JButton btnDeleteBook_1 = new JButton("Delete book");
		btnDeleteBook_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try
				{
					if (textField_3.getText() == null || textField_3.getText().isEmpty()){
						JOptionPane.showMessageDialog(null, "Please enter some details");
					}else {JOptionPane.showMessageDialog(null,"Book deleted successfully");}
					
					theQuery("delete from book where bookName="+textField_3.getText()+")");
					/*JOptionPane.showMessageDialog(null,"Book inserted successfully");*/
				}
				
				catch(Exception ex){}
				}
		});

	JButton btnUpdatePrice_1 = new JButton("Update Price");
		btnUpdatePrice_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try
				{
					if (textField_5.getText() == null || textField_5.getText().isEmpty()){
						JOptionPane.showMessageDialog(null, "Please enter some details");
					}else {JOptionPane.showMessageDialog(null,"Book inserted successfully");}
					
					theQuery("UPDATE book set price = "+textField_5.getText()+" where bookName = "+textField_4.getText());
					/*JOptionPane.showMessageDialog(null,"Book inserted successfully");*/
				}
				
				catch(Exception ex){}
							}
		});

public void theQuery(String query){

		Connection con = null;
		Statement st = null;
		try{
			con = DriverManager.getConnection("jdbc:mysql://localhost/bookshop","root","Password");
			st = con.createStatement();
			st.executeUpdate(query);
			
		}catch(Exception ex){JOptionPane.showMessageDialog(null,ex.getMessage());}
	}
Kopiuj
CREATE TABLE book
(
   bookID int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   bookName varchar(30) NOT NULL,
   authorName varchar(30) NOT NULL,
   price double(5, 2)
);
edytowany 2x, ostatnio: bogdans
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Zacznij od sensownej obsługi błędów

Kopiuj
catch(Exception ex){
  //coś tu wyświetl, minimum to System.out.println(ex);
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
I3
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:42
0

Przy update po wpisaniu nazwy

Unknown column "r" 'where clause'

usuwanie

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1

PK jest w bookID i jak podam bookId to bez problemu usunie zapis czy wpisac w kodzie aby zrzucił PK z ID i przepisac go do nazwy ? raczej chyba jest to nie możliwe. Nie wiem co zastosować aby zadziałało mi usuwanie i update.

edytowany 1x, ostatnio: Ic3m4n
I3
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:42
0

Jak wpisze

Kopiuj
 theQuery("Delete from book where bookID="+textField_3.getText()); 

to nie ma problemu wszystko działa po nazwie błąd jak w poprzedniej widomości ręce mi już opadają brakuje mi 2 rzeczy i nie mogę znaleźć rozwiązania.

edytowany 2x, ostatnio: Ic3m4n
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Porównaj zapytanie działające

Kopiuj
theQuery("Delete from book where bookID="+textField_3.getText());

z niedziałającym

Kopiuj
theQuery("delete from book where bookName="+textField_3.getText()+")");

Znajdź wszystkie różnice i wyciągnij wnioski.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
0

Doskonale wiem ze bookID ma PK i dla tego bez problemu wszystko działa, problem jest w tym ze chce aby działało po nazwie bez zmieniania bazy. Tak jak pisałem wcześniej.

I3
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:42
0

Jezeli chodzi o +")"); to wkleiłem bez poprawek

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Dostałeś komunikat

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
tzn. że ten błędny nawias jest w Twoim kodzie.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
I3
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:42
0

2x taki sam błąd Unknown column "r" 'where clause'

Próbowałem z alter table i nie przyjmuje mi nazwy książki :/

Kopiuj

theQuery("Delete from book where bookName="+textField_3.getText());

theQuery("UPDATE book set price= "+textField_5.getText()+" where bookName ="+textField_4.getText());
edytowany 1x, ostatnio: Ic3m4n
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Kolumna bookName jest znakowa. Polecenie powinno chyba wyglądać tak:

Kopiuj
theQuery("Delete from book where bookName=\"" + textField_3.getText() + "\"");

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)