Да можно смешать их.
необходимо использовать Objective C, чтобы непосредственно воздействовать на объекты GUI и получить уведомления от них.
Эти объекты Objective C могут непосредственно назвать логику C++ при помещении их в .mm файлы вместо чистого Objective C.m файлы. Обратите внимание, что можно видеть (намного) более старый совет предложить использовать верхний регистр.M для указания на Objective C ++, но это очень облуплено и вероятно смутить Вас, а также компилятор.
Вы не должны переносить каждый объект C++, но Ваш код Objective C должен будет содержать указатели на них.
Apple больше не публикует образцов, показывающих, как сделать это.
существует большое видео Peter Steinberger, размещенным в Realm [Цель] C++: Что Могло Возможно Пойти не так, как надо? я настоятельно рекомендую для любого все еще использование Objective C ++, и можно быстро просмотреть расшифровку стенограммы.
imho: Пример использования HTTP-клиента Apache
:
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams;
import java.io.*;
public class HttpClientTutorial {
private static String url = "http://www.apache.org/";
public static void main(String[] args) {
// Create an instance of HttpClient.
HttpClient client = new HttpClient();
// Create a method instance.
GetMethod method = new GetMethod(url);
// Provide custom retry handler is necessary
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler(3, false));
try {
// Execute the method.
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
System.err.println("Method failed: " + method.getStatusLine());
}
// Read the response body.
byte[] responseBody = method.getResponseBody();
// Deal with the response.
// Use caution: ensure correct character encoding and is not binary data
System.out.println(new String(responseBody));
} catch (HttpException e) {
System.err.println("Fatal protocol violation: " + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
System.err.println("Fatal transport error: " + e.getMessage());
e.printStackTrace();
} finally {
// Release the connection.
method.releaseConnection();
}
}
}
некоторые особенности:
JComboBox comboBox = new JComboBox();
comboBox.setUI(new BasicComboBoxUI() {
@Override
protected JButton createArrowButton() {
return new JButton() {
@Override
public int getWidth() {
return 0;
}
};
}
});
Если getWidth () возвратит 0, это гарантирует, что:
а) кнопка не отображается
б) для него не зарезервировано место, что позволяет вводить все поле
. Я обнаружил, что мне нужно вызвать .setUI ()
через SwingUtilities.invokeLater ()
, но в зависимости от структуры вашего кода, вам может и не потребоваться.
Если вы хотите автозаполнение, добавьте некоторые элементы в поле со списком и используйте AutoCompleteDecorator.decorate (comboBox)
. Как упоминалось ранее, класс AutoCompleteDecorator
является частью SwingX .
Это может сделать ваш ящик странным при использовании другого L&F, поэтому вам придется выбрать, какой CombiBoxUI создать, чтобы получить правильный вид.
Если вы не хотите, чтобы раскрывающийся список отображался, когда в поле со списком ничего нет, также переопределите этот метод в BasicComboBoxUI: